我设置了一个电子邮件帐户,每当它收到电子邮件时都会触发 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/