Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/293.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在python中创建处理队列_Python - Fatal编程技术网

在python中创建处理队列

在python中创建处理队列,python,Python,我设置了一个电子邮件帐户,每当它收到电子邮件时就会触发python脚本。该脚本执行了几个函数,大约需要30秒,并将一个条目写入MYSQL数据库 在第一封电子邮件发出后不到30秒,第二封电子邮件就发送出去了,一切都会顺利进行。第二封电子邮件处理正确,但第一封电子邮件会在数据库中创建损坏的条目 我想保存电子邮件数据 msg=email.message_from_file(sys.stdin) 如果脚本尚未完成之前电子邮件的处理,则在队列中 我正在使用python 2.5。 有谁能推荐一个可以实现这

我设置了一个电子邮件帐户,每当它收到电子邮件时就会触发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,然后我通过让进程自行终止来处理它

有关更多信息,请参阅

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

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)

您也可以只使用,它完全满足您的需要。

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

fcntl.lockf(fd, fcntl.LOCK_EX | fcntl.LOCK_NB) 
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)
这将引发一个IOError,然后我通过让进程自行终止来处理它

有关更多信息,请参阅

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

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)

你也可以直接使用它,它完全可以满足你的需要。

芹菜是一款非常好的软件,在这种情况下使用它就像用大锤敲钉子一样。从概念上讲,您正在寻找一个作业队列(芹菜提供了这个队列),但您用来触发脚本的电子邮件收件箱也是一个功能强大的作业队列

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)
更直接的解决方案是让Python worker脚本每隔几秒钟轮询邮件服务器本身(例如使用内置的)检索所有新邮件,然后一次处理一封新邮件。这将序列化脚本正在执行的工作,从而防止两个副本同时运行

例如,您可以将现有脚本封装在如下函数中(来自上面链接的文档):


编辑:语法

虽然芹菜是一款非常好的软件,但在这种情况下使用它就像用大锤敲钉子一样。从概念上讲,您正在寻找一个作业队列(芹菜提供了这个队列),但您用来触发脚本的电子邮件收件箱也是一个功能强大的作业队列

更直接的解决方案是让Python worker脚本每隔几秒钟轮询邮件服务器本身(例如使用内置的)检索所有新邮件,然后一次处理一封新邮件。这将序列化脚本正在执行的工作,从而防止两个副本同时运行

例如,您可以将现有脚本封装在如下函数中(来自上面链接的文档):


编辑:语法

您是否阅读了有关
队列
包的信息?还有
多处理
包?那芹菜项目呢?读完所有这些之后,你能把问题的措辞改得更具体些吗?我会通读一遍。谢谢你给我一个起点。是你写的这个Python脚本还是你只是在使用它?它究竟为什么要“腐败”任何东西?当您触发Python脚本时,它们位于不同的进程中,使用并发进程中的DB是典型的做法,不应该损坏数据。那么,除了您所描述的之外,您的代码在做什么呢?您最好先修复这些bug,然后再创建一个队列来解决它们。@DerekLitz您能对代码给出任何反馈吗?我很难排除故障,因为我无法重新创建“损坏”消息。给您一个我得到的输出示例:æ¼æµææ¼æ…æ怖〖除了没有db.commit()之外,没有任何东西向我跳出来,这可能是问题,也可能不是问题(可能不是因为您看到的东西被保存到db中)。有关更多信息,请参阅。无论如何,对于开发人员来说,一条黄金法则是“如果你不能复制它,它就不是一个bug。”如果这是一个高优先级的修复,我会努力降低这些步骤,所以当你进行更改时,你有一些方法来确认它实际上已经修复。很可能是垃圾进->垃圾出。。。但这只是猜测,没有任何重复性。你读过
队列
包吗?还有
多处理
包?那芹菜项目呢?读完所有这些之后,你能把问题的措辞改得更具体些吗?我会通读一遍。谢谢你给我一个起点。是你写的这个Python脚本还是你只是在使用它?它究竟为什么要“腐败”任何东西?当您触发Python脚本时,它们位于不同的进程中,使用并发进程中的DB是典型的做法,不应该损坏数据。那么,除了您所描述的之外,您的代码在做什么呢?您最好先修复这些bug,然后再创建一个队列来解决它们。@DerekLitz您能对代码给出任何反馈吗?我很难排除故障,因为我无法重新创建“损坏”消息。给您一个我得到的输出示例:æ¼æµææ¼æ…æ怖〖除了没有db.commit()之外,没有任何东西向我跳出来,这可能是问题,也可能不是问题(可能不是因为您看到的东西被保存到db中)。有关更多信息,请参阅。不管怎样,