我使用Python Queue cclass来管理多个工作线程之间共享的任务列表。实际的代码是很棒的,我仍然在使它完全没有bug。工作线程会不时崩溃,我必须重新启动整个例程。在此过程中,我将丢失已排队的所有任务。有没有办法将队列保存到文件中,这样每当我重新启动进程时,任务列表都会从该文件中预加载?
首先想到的是,当我获取或将任务放入队列时,我应该同时读取和写入文件。但是,这并没有给我queue.task_done()的功能,可能不是最优化的解决方案。任何想法都将不胜感激。
答案 0 :(得分:5)
您是否只考虑了pickling your queue?
答案 1 :(得分:1)
有多种方法,包括pickle
模块......
但是在我看来,只需要写入一个文件,每行一行,队列中包含您可能想要保存的其他属性的队列中的每个元素,就像task_done
一样。
示例:
element1, True
element2, False
...
在python中超级容易阅读这样格式的文件,有点像:
for line in file('path/file.ext'):
name, state = line.split(sep_char)
#and them insert into the queue...
答案 2 :(得分:0)
执行此操作的简单方法是将AMQP用于消息队列,并让消息代理为您处理消息。我使用RabbitMQ作为具有持久持久队列的消息代理实现了类似的系统。当我在虚拟Linux服务器上使用过时的1.72服务器版本时,这个消息甚至幸免于RabbitMQ服务器软件的崩溃,只有512M的RAM和一百万左右的消息。
我这样做的方式是每种类型的工作者都使用来自不同队列的消息。如果我需要多个这种类型的工作者,那么消息队列将自动循环,如果一个工作人员无法完成处理消息,他们就不会确认它并且它会回到队列中。
我写了一个小垫片模块,大约有80行代码放在kombu
前面,后来改写为使用py-amqplib
。如果我早先知道haigha
我会使用它,因为它与AMQP规范文档非常接近。
我不推荐使用kombu,因为它的调试非常复杂,并且以奇怪的方式偏离了AMQP标准。看一下haigha
因为尽管文档只是PyPi上的一个示例代码片段,但它比kombu或amqplib更好地记录,因为你可以使用AMQP规范作为你的haigha文档。
答案 3 :(得分:0)
我可以提供的一个简单选项是将数据库表包装在一个类中,并将其用作队列。自动增量列可以为此创建奇迹(要删除的下一个项目是ID最低的项目。)
class dbQueue:
init():
# Pick some random id for this run (or set it to some thing you know).
put():
# Insert entry into table
get():
# The update .. select combo removes the need for a database that has transactions.
# If no entries bear your ID:
# Update the next entry that is not already marked with your ID.
# Select the entry that matches your ID and return it.
task_done():
# Delete the entry with your ID.
根据队列更新的频率,这将没有最佳性能,即使内存中的sqlite数据库也不会像链表结构那样快。另一方面,您可以使用任何可以访问数据库的工具查看数据库,这样您就可以看到正在进行的工作。
答案 4 :(得分:0)
在工人和主人之间实施握手机制。
主人有一个任务列表,在将它们放入队列之前,将列表挑选到文件中。 然后将任务插入队列。当工人完成后,他发回一条ACK消息。 只有在那时才取消任务列表并删除相应的ID。