Celery的信号量机制
我们正在用Python和Celery开发一个分布式应用程序,主要是为了处理任务队列。
这个应用需要从远程的互联网服务提供商(比如:gmail)通过IMAP协议下载邮件。我们希望能够并行地完成这个任务。对于每个邮箱账户,允许的连接数量是有限的,所以我们需要一种方法,能够准确地记录所有正在下载的账户的活跃连接。
我找到了一些使用Redis的Celery原子锁的例子,但没有一个能像我们需要的那样跟踪有限资源的池子。而且我们自己尝试实现的方案也出现了难以调试的竞争条件,导致我们的锁有时无法释放。
1 个回答
2
因为celery使用了多进程库来处理任务,所以你可以使用一个叫做 multiprocessing.Semaphore([value])
的东西,它是安全的。
你需要提前创建这个信号量,并把它传进去。你可以把默认值设置为你想允许的最大同时访问次数。然后在你建立IMAP连接之前先获取这个信号量,断开连接后再释放它。