Python: получить блокировку с многопоточностью и без нее ⇐ Python
Python: получить блокировку с многопоточностью и без нее
У меня есть приложение Python + Flask на сервере Nginx + Gunicorn с несколькими рабочими процессами.
Одним из ключевых компонентов приложения является «индекс». Каждый работник и каждый поток должны иметь уникальный индекс. При каждой операции индекс увеличивается на 1.
Чтобы предотвратить использование одного и того же «индекса» более чем одним рабочим процессом/потоком, он сохраняется в Redis, а чтение, приращение и сохранение индекса в/из Redis защищается с помощью Lock().
Индекс извлекается и увеличивается с помощью как однопоточных, так и многопоточных функций.
Проблема в том, что Lock нельзя заблокировать с помощью многопоточности. Я пробовал разные варианты двух предложенных здесь решений, но ни одно из них не сработало, видимо потому, что оно должно работать как с многопоточным, так и с непоточным режимом.
Код распределен (и должен быть) в трех разных файлах .py.
#rotator.py из многопроцессорного импорта Lock блокировка = Блокировка() защита приращения_индекса(): time_before = datetime.datetime.now() с замком: индекс = get_index_from_redis() индекс = индекс + 1 save_index_at_redis (индекс) защита rotator_of_index(): новый_индекс = инкремент_индекс() # делать другие вещи, регистрировать новый индекс и т. д. вернуть новый_индекс # Salary_worker.py из импорта ротатора rotator_of_index защита do_work(n): индекс = ротатор_индекса() # делать другие дела вернуть что-то # do_work без многопоточности: защита do_more_work(): что-то = do_work(n) # делай больше вещей do_with_threading.py из зарплаты_работника импортировать do_work из пула импорта multiprocessing.dummy как ThreadPool защита do_work_with_threading(): list_of_n = [1, 2, 3, 4, 5] пул = ThreadPool(15) list_of_results =pool.map(do_work, list_of_n) пул.закрытие() пул.join() печать (список_результатов) Я также пробовал использовать лучевой пул для замены многопроцессорного пула, но безуспешно.
Есть ли альтернатива, чтобы это заработало?
У меня есть приложение Python + Flask на сервере Nginx + Gunicorn с несколькими рабочими процессами.
Одним из ключевых компонентов приложения является «индекс». Каждый работник и каждый поток должны иметь уникальный индекс. При каждой операции индекс увеличивается на 1.
Чтобы предотвратить использование одного и того же «индекса» более чем одним рабочим процессом/потоком, он сохраняется в Redis, а чтение, приращение и сохранение индекса в/из Redis защищается с помощью Lock().
Индекс извлекается и увеличивается с помощью как однопоточных, так и многопоточных функций.
Проблема в том, что Lock нельзя заблокировать с помощью многопоточности. Я пробовал разные варианты двух предложенных здесь решений, но ни одно из них не сработало, видимо потому, что оно должно работать как с многопоточным, так и с непоточным режимом.
Код распределен (и должен быть) в трех разных файлах .py.
#rotator.py из многопроцессорного импорта Lock блокировка = Блокировка() защита приращения_индекса(): time_before = datetime.datetime.now() с замком: индекс = get_index_from_redis() индекс = индекс + 1 save_index_at_redis (индекс) защита rotator_of_index(): новый_индекс = инкремент_индекс() # делать другие вещи, регистрировать новый индекс и т. д. вернуть новый_индекс # Salary_worker.py из импорта ротатора rotator_of_index защита do_work(n): индекс = ротатор_индекса() # делать другие дела вернуть что-то # do_work без многопоточности: защита do_more_work(): что-то = do_work(n) # делай больше вещей do_with_threading.py из зарплаты_работника импортировать do_work из пула импорта multiprocessing.dummy как ThreadPool защита do_work_with_threading(): list_of_n = [1, 2, 3, 4, 5] пул = ThreadPool(15) list_of_results =pool.map(do_work, list_of_n) пул.закрытие() пул.join() печать (список_результатов) Я также пробовал использовать лучевой пул для замены многопроцессорного пула, но безуспешно.
Есть ли альтернатива, чтобы это заработало?
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Моя программа на Python с многопроцессорностью и многопоточностью никогда не остановится
Anonymous » » в форуме Python - 0 Ответы
- 14 Просмотры
-
Последнее сообщение Anonymous
-