【问题标题】:Python: file-based thread-safe queuePython:基于文件的线程安全队列
【发布时间】:2012-03-27 18:42:47
【问题描述】:

我正在 Python 中创建一个应用程序(应用程序 A),它侦听端口、接收 NetFlow 记录、封装它们并将它们安全地发送到另一个应用程序(应用程序 B)。应用 A 还会检查记录是否成功发送。如果没有,则必须保存。应用程序 A 等待几秒钟,然后尝试再次发送,等等。这是重要的部分。如果发送不成功,则必须存储记录,但同时还有更多的记录可以到达,也需要存储。理想的方法是排队。但是我需要这个队列在文件中(在磁盘上)。例如,我发现此代码 http://code.activestate.com/recipes/576642/ 但它“打开时,将完整文件加载到内存中”,这正是我想要避免的。我必须假设这个包含记录的文件最多有几个 GB。

所以我的问题是,您建议将这些记录存储在什么位置?它需要处理大量数据,另一方面,如果它不是太慢,那就太好了,因为在正常活动期间,一次只保存一条记录,并立即读取和删除。所以基本状态是一个空队列。它应该是线程安全的。

我应该使用数据库(dbm、sqlite3..)还是 pickle、shelf 之类的东西?

我对此有点困惑......谢谢。

【问题讨论】:

    标签: python file caching queue


    【解决方案1】:

    您可以为此使用 Redis 作为数据库。它非常非常快,队列非常好,并且可以通过几种方式将其状态保存到磁盘,具体取决于您想要的容错级别。作为一个外部进程,您可能不需要让它使用非常严格的保存策略,因为如果您的程序崩溃,所有内容都会保存在外部。

    请参阅此处http://redis.io/documentation,如果您想了解有关如何在 redis 中执行此操作的更多详细信息,我很乐意详细说明。

    【讨论】:

    • 感谢您的意见,对于迟到的答复深表歉意。我正在查看您提出的解决方案,但我终于意识到我想要更标准的东西。我的意思是由于应用程序的可移植性,最好使用 Python 标准模块。我最终使用了 sqlite,对此我很满意。我只需要设置一些 PRAGMA 设置(例如 synchronous 为 OFF 或 journal_mode 为 OFF)来提高数据库性能。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-11-05
    • 1970-01-01
    • 1970-01-01
    • 2013-02-23
    • 1970-01-01
    • 1970-01-01
    • 2012-12-26
    相关资源
    最近更新 更多