Зачем нужны 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 шт):

Автор решения: inzem77

Возможно, например, короутниа1 делает запрос на изменение ключа в редис, после этого происходит переключение в короутина2. Короутина2 тоже изменяет тот же ключ в редисе. Далее выполнение опять переключается на первую короутину в которую приходит ответ о том, что ключ сохранен.

А на самом деле значение ключа было переписано во второй короутине. Может это ответ на мой вопрос ?

→ Ссылка
Автор решения: eri

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

Запускаем таск отправки

async def sender(lock1, lock2):
    while True:
        async with lock1, lock2:
            await send(data)

А в приемниках используем lock1 и lock2. Тогда отправка исполнится когда будут готовы оба компоненты и при этом data будет прикрыта от изменений на время отправки

→ Ссылка