将Python队列保存到文件
我正在使用Python的Queue类来管理多个工作线程共享的任务列表。我的代码非常庞大,目前还在努力让它完全没有bug。偶尔,工作线程会崩溃,这时候我就得重新启动整个程序。在这个过程中,我会丢失所有已经排队的任务。有没有办法把队列保存到一个文件里,这样每次我重启程序时,可以从这个文件中预加载任务列表呢?
乍一看,似乎在我往队列里添加或取出任务的时候,应该同时读写一个文件。但是这样做就不能使用queue.task_done()这个功能,而且可能不是最优化的解决方案。任何建议都会非常感谢。
5 个回答
做这件事最简单的方法是使用AMQP来处理消息队列,让消息中介来帮你管理消息。我用RabbitMQ作为消息中介,搭建了一个类似的系统,使用了持久化的队列。即使在我使用一个老旧的1.72版本的RabbitMQ服务器时,它也能在虚拟Linux服务器上存活下来,那个服务器只有512M的内存,里面还有大约一百万条消息。
我做法是,每种类型的工作者从不同的队列中获取消息。如果我需要多个同类型的工作者,消息队列会自动进行轮询分配。如果某个工作者无法处理某条消息,他们只需不确认(ack)这条消息,它就会重新回到队列中。
我写了一个小模块,大约80行代码,放在kombu
前面,后来又重写成使用py-amqplib
。如果我早知道haigha
,我会选择它,因为它与AMQP的规范文档非常接近。
我不推荐使用kombu,因为它在调试时太复杂,而且在一些奇怪的地方偏离了AMQP标准。可以看看haigha
,虽然它的文档在PyPi上只有一个示例代码片段,但它的文档比kombu或amqplib要好,因为你可以用AMQP的规范作为haigha的文档。
有很多方法可以解决这个问题,包括使用 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...
你有没有想过直接把你的队列“腌制”一下呢?