将python队列保存到文件中

时间:2011-08-04 16:19:11

标签: python multithreading queue non-volatile

我使用Python Queue cclass来管理多个工作线程之间共享的任务列表。实际的代码是很棒的,我仍然在使它完全没有bug。工作线程会不时崩溃,我必须重新启动整个例程。在此过程中,我将丢失已排队的所有任务。有没有办法将队列保存到文件中,这样每当我重新启动进程时,任务列表都会从该文件中预加载?

首先想到的是,当我获取或将任务放入队列时,我应该同时读取和写入文件。但是,这并没有给我queue.task_done()的功能,可能不是最优化的解决方案。任何想法都将不胜感激。

5 个答案:

答案 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。