Семафороподобный механизм для сельдерея - PullRequest
7 голосов
/ 04 мая 2011

Мы разрабатываем распределенное приложение на Python + Celery для нашей очереди задач.

Наше приложение требует, чтобы мы загружали электронные письма от удаленного интернет-провайдера через IMAP (например, gmail), и мы надеемся, что эта задача будет выполняться параллельно. Для данной учетной записи электронной почты вам предоставляется ограниченное количество симуляционных подключений, поэтому нам нужен способ атомарного отслеживания наших активных подключений для всех загружаемых учетных записей.

Я нашел несколько примеров атомарных блокировок для Celery с использованием Redis, но ни один из них не может отслеживать пул ограниченных ресурсов, подобных этому, и все попытки реализовать наши собственные привели к трудным отладкам условий гонки, что приводило к наши замки с перерывами никогда не освободятся.

1 Ответ

2 голосов
/ 21 июня 2011

Поскольку сельдерей использует многопроцессорную библиотеку для процессов, вы должны иметь возможность использовать безопасный процесс multiprocessing.Semaphore([value]).

Вы захотите создать семафор заранее и передать его,и вы можете установить значение по умолчанию, равное максимальному количеству одновременных обращений, которые вы хотите разрешить.Затем приобретите до подключения к IMAP и отпустите после отключения.

...