Yourmind
@Yourmind
пишу говнокод в перерывах между едой и сериалами

Как настроить блокировку только для некоторых потоков?

У меня есть некоторый код, который должен быть залочен только для некоторых потоков

name = order.id
lock = Lock()

with lock:
    change_order()


Вся суть в том, что функция change_order должна лочиться только для потоков у которых выходит такое же имя заказа name = order.id, если имя другое то код не должен лоччиться для потока. Так, если поток с заказом 1 выполняет change_order(), то это никак не должно мешать выполнять change_order() потоку с заказом 2, но если еще один поток будет тоже иметь заказ 1, то change_order() для него должен быть залочен, пока первый поток его не выполнит. Можно ли это реализовать методами lock, как то присваивая это им внутри, или придется пилить собственные костыли?
  • Вопрос задан
  • 49 просмотров
Пригласить эксперта
Ответы на вопрос 2
@Dzhigit
Начинающий прогер
Если я правильно понял вашу проблему, а она связанна с реализацией параллельного выполнения вашего скрипта, так чтобы оба потока выполнялись одновременно не мешая друг другу?

Если так, то попробуйте поискать информацию о асинхронном программировании на Python, изучите модуль asyncio и работу методов async и await в Python. Желательно так же понимание работы функций генераторов и сопрограмм на python, и как их реализовать.
Ответ написан
Комментировать
Vindicar
@Vindicar
RTFM!
Lock (он же мьютекс) такими вещами не занимается.
Ты можешь скостылить конструкцию, при которой у каждого order есть свой Lock, но это будет или расточительно (если всегда создавать Lock) или утомительно (если создавать его при обращении к order).
Асинхронный подход может помочь, но он потребует почти полной переделки кода. Не очень-то удобно.
А вообще стоит задаться вопросом - этот Lock точно является узким местом?
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы