我们正在Python + Celery中为我们的任务队列开发一个分布式应用程序。
我们的应用程序要求我们通过IMAP(例如:gmail)从远程ISP下载电子邮件,我们希望能够并行完成此任务。对于给定的电子邮件帐户,您被授予限制为多个模拟连接的权限,因此我们需要一种方法来自动跟踪所有正在下载的帐户的活动连接。
我已经使用Redis找到了Celery的多个原子锁示例,但没有一个可以跟踪这样的有限资源池,并且所有实现我们自己的尝试都导致难以调试竞争条件,导致我们的间歇性锁永远不会被释放。
答案 0 :(得分:2)
由于芹菜使用多处理库进行处理,您应该能够使用安全过程multiprocessing.Semaphore([value])
。
您需要预先创建信号量并将其传入,并且可以设置一个默认值,该值等于您要允许的最大并发访问数。然后在您的IMAP连接之前获取并在断开连接后释放。