我正在使用 eventlet 并且有两个主要进程正在运行。其中一个进程充当生产者,另一个充当消费者。问题是,我不想使用 eventlet 包中的队列,而是想使用 db。使用队列我可以简单地传递 (block=True) 作为参数,并且 eventlet 将负责阻塞消费者例程的执行,直到生产者将某些东西放入队列中。如果我用 db 替换队列,我如何有效地实现阻塞逻辑。
问问题
234 次
2 回答
2
对于背景,您可能希望阅读此 Wikipedia 文章:http ://en.wikipedia.org/wiki/Inter-process_communication
我建议在这两个进程之间使用套接字连接。您可以通过这种方式轻松发送一些数据以及唤醒信号。请注意,TCP 没有消息的概念(如作为一个整体发送和传递的信息),因此您必须实现一个简单的协议来实现这一点。我推荐 tnetstring [1]。其他方法是使用 ZeroMQ,因为它提供消息。Eventlet 对这两种方式都提供了出色的支持。
您可能需要生产者/消费者的事务作业语义,例如:任何一条数据要么完全由某个消费者处理,要么失败,需要反复尝试或人工关注。然后你真的必须使用某种带有事务的数据库。有现成的解决方案:芹菜 [2]、豆茎 [3]、火堆 [4]。
- [1] https://pypi.python.org/pypi/tnetstring
- [2] http://celery.readthedocs.org/我不喜欢它是“任务队列的 django”[3],但它可以完成工作,如果您需要任务队列,它可能是最好的选择。在这种情况下,django 是不必要的复杂、无法专注于少数明确的问题、企业风格创造就业机会的代名词,因为学习该工具需要花费大量时间和精力。
- [3] http://beanstalkapp.com/
- [4] https://github.com/binarydud/pyres
于 2014-10-08T16:21:23.617 回答
0
每 N 秒在 DB 中查找数据。如果什么也没找到 - 睡觉。
更新:或使用 Postgresql LISTEN/NOTIFY 机制,如http://initd.org/psycopg/articles/2010/12/01/postgresql-notifications-psycopg2-eventlet/
于 2014-10-08T07:27:04.630 回答