Зачем нужны Lock в asyncio
Не понял для себя следующий момент в python asyncio.
class asyncio.Lock(*, loop=None)¶ Implements a mutex lock for asyncio tasks. Not thread-safe. An asyncio lock can be used to guarantee exclusive access to a shared resource.
Имеем, что это блокировка нужна внутри одного потока, когда разные короутины могут получить доступ к одному объекту одновременно. В этой статье https://python-gino.org/docs/en/1.0/explanation/async.html в том числе описывается, что так как мы работаем в одном потоке, то одновременно код из разных короутин не может изменять состояние какой либо переменной в одном потоке.
Красным помечено выполнение кода, зеленым ожидание ввода вывода.
Так в чем я ошибаюсь ?
Ответы (2 шт):
Возможно, например, короутниа1 делает запрос на изменение ключа в редис, после этого происходит переключение в короутина2. Короутина2 тоже изменяет тот же ключ в редисе. Далее выполнение опять переключается на первую короутину в которую приходит ответ о том, что ключ сохранен.
А на самом деле значение ключа было переписано во второй короутине. Может это ответ на мой вопрос ?
Второй случай. Задача нужно принять данные из нескольких источников, сгруппировать и отправить дальше.
Запускаем таск отправки
async def sender(lock1, lock2):
while True:
async with lock1, lock2:
await send(data)
А в приемниках используем lock1 и lock2. Тогда отправка исполнится когда будут готовы оба компоненты и при этом data будет прикрыта от изменений на время отправки