Python中一个好的持久化同步队列

9 投票
4 回答
10683 浏览
提问于 2025-04-17 09:16

我现在不太关心先进先出(fifo)或后进先出(filo)的选项,不过将来可能会用到这些功能。

我想找一种简单又快速的方法,把最多一GB的数据或者几千万条记录存储到硬盘上,并且可以被多个进程同时访问。这些记录只是简单的40字节字符串,而不是Python对象。我其实不需要像shelve那样复杂的功能。

我看到过这个http://code.activestate.com/lists/python-list/310105/,看起来挺简单的。不过它需要升级到新的队列版本。

我在想有没有更好的选择?我担心如果发生停电,整个存储的文件会损坏,而不仅仅是其中的一条记录。

4 个回答

3

我觉得你想要的是 PyBSDDB。你可以选择队列作为访问方式。PyBSDDB 是一个基于 Oracle Berkeley DB 的 Python 模块。它支持同步访问,可以从不同的进程访问,虽然我不确定通过 Python 的接口是否能做到这一点。关于多个进程同时写入数据库的情况,我找到了一些讨论,具体可以参考 这个帖子

3

可以试试使用Celery。虽然它不是纯粹的Python,因为它使用RabbitMQ作为后台,但它非常可靠、持久,并且可以分布式处理。总的来说,长期来看,它比使用文件或数据库要好得多。

5

这个问题虽然很老,但 persist-queue 似乎是个很不错的工具,可以用来处理这类任务。

persist-queue 实现了一个基于文件的队列和一系列基于 sqlite3 的队列。它的目标是满足以下几个要求:

  • 基于磁盘:每个排队的项目都应该存储在磁盘上,以防出现崩溃。
  • 线程安全:可以被多个线程同时使用的生产者和消费者。
  • 可恢复:在进程重启后,可以读取之前的项目。
  • 兼容绿色线程:可以在 greenlet 或 eventlet 环境中使用。

默认情况下,persist-queue 使用 pickle 对象序列化模块来支持对象实例。大多数内置类型,比如 int(整数)、dict(字典)、list(列表)都可以直接通过 persist-queue 保存。如果你想支持自定义对象,可以参考 Pickling 和 unpickling 扩展类型(Python2)以及 Pickling 类实例(Python3)。

撰写回答