python - 在python中创建一个处理队列

标签 python

我设置了一个电子邮件帐户,每当它收到电子邮件时都会触发 python 脚本。该脚本执行几个函数,这可能需要大约 30 秒,并将一个条目写入 MYSQL 数据库。

在第一封电子邮件发送后不到 30 秒内发送第二封电子邮件之前,一切都运行顺利。第二封电子邮件被正确处理,但第一封电子邮件在数据库中创建了一个损坏的条目。

我希望保留电子邮件数据,

msg=email.message_from_file(sys.stdin)

如果脚本尚未处理完前一封电子邮件,则在队列中。

我正在使用 python 2.5。 任何人都可以推荐一个可以完成此任务的包/脚本吗?

最佳答案

我发现这是一种避免在前一个 cronjob 仍在运行时运行 cronjob 的简单方法。

fcntl.lockf(fd, fcntl.LOCK_EX | fcntl.LOCK_NB) 

这将引发一个 IOError,然后我通过让进程自行终止来处理它。

参见 http://docs.python.org/library/fcntl.html#fcntl.lockf了解更多信息。

无论如何,您可以轻松地使用相同的想法来一次只允许一个作业运行,这实际上与队列不同(因为任何等待的进程都可能获得锁),但它实现了您的目标想要。

import fcntl
import time
fd = open('lock_file', 'w')
fcntl.lockf(fd, fcntl.LOCK_EX)
# optionally write pid to another file so you have an indicator
# of the currently running process
print 'Hello'
time.sleep(1)

你也可以只使用 http://docs.python.org/dev/library/multiprocessing.html#exchanging-objects-between-processes ,这正是您想要的。

关于python - 在python中创建一个处理队列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8949609/

相关文章:

python - python 中的多线程和异步套接字

python - Django ( python ): DatabaseError : x Table has No Column named y

python - 从不同的 .py 文件调用函数时找不到 Errno 2 文件

python Selenium : waiting for one element OR another element to load

python - 将小 numpy 数组保存为大图像

python - 使用与传递的变量相同的函数参数名称

python - 比较两个列表的元素

python - 当我的函数未在Python中指定关键字参数时,为什么会得到 “SyntexError: non-keyword arg after keyworkd arg”?

python - 如何在 MySQL 中匹配列

python - 根据条件删除列表的元素