2011-05-03 21 views
7

我们正在为我们的任务队列在Python + Celery中开发分布式应用程序。Celery的类信号机制

我们的应用程序要求我们通过IMAP(例如:gmail)从远程ISP下载电子邮件,我们希望能够同时完成这项任务。对于一个给定的电子邮件帐户,您被授予一定数量的模拟连接限制,因此我们需要一种方法来自动跟踪所有正在下载的帐户的活动连接。

我发现了使用Redis的Celery原子锁的多个示例,但没有一个可以跟踪像这样的有限资源池,并且所有尝试实现我们自己的尝试都导致难以调试竞争条件,导致我们的锁间歇性地永远不会被释放。

+0

芹菜已不使用水池吗? http://docs.celeryproject.org/en/v2.2.5/internals/reference/celery.concurrency.processes.pool.html?highlight=pool%20limit#celery-concurrency-processes-pool这似乎是你想要的东西存在于芹菜中。 – 2011-05-04 01:49:27

+0

也许[hot-redis](https://github.com/stephenmcd/hot-redis)可能有帮助 – mmoya 2013-10-31 12:23:30

回答

2

由于芹菜使用多处理库进程,您应该能够使用进程安全multiprocessing.Semaphore([value])

您需要预先创建信号量并将其传入,并且您可以将默认值设置为等于要允许的最大并发访问数。然后在断开连接之后在IMAP连接和释放之前获取。