Создание неблокирующего асинхронного цикла в Python

Рейтинг: 2Ответов: 1Опубликовано: 02.08.2023

Необходимо считывать через WebSocket поступающие на клиент сообщения, для этого у меня есть функция подключения к серверу, которая через async for читает содержимое канала с сообщениями.

В моем случае проблема в том, что цикл блокирует последующий код, как можно это исправить?

Главная функция

def main():

    clientChat = ClientChat(URL)

    singInId = input("Введите ID пользователя: ")
    asyncio.run(clientChat.auth(singInId))

    print(f"{clientChat.getName()}, Добро пожаловать! Ваш ID - {clientChat.currentID}")




if __name__ == '__main__':
    main()

Метод с бесконечным циклом

    async def auth(self, userID: str):
        subscription = gql("""
        ...
        """)

        args = {"UserID": userID}

        transport = WebsocketsTransport(url="ws://" + self.url)

        async with Client(transport=transport, fetch_schema_from_transport=True) as session:
            

            ...

            async for message in session.subscribe(subscription, variable_values=args):
                 print(message)
                 self.allMessages.append(message)

            ...

Ответы

▲ 0Принят

Запусти цикл через crate_task и тогда код пойдет дальше. Но убедись что работаешь с self.allMessages потокобезопасно. Лучше используй очереди