Я использую asyncio, но асинхронная функция блокирует другие асинхронные функции с помощью await asyncio.sleep (5) - PullRequest
0 голосов
/ 22 июня 2019

Я включил asyncio для асинхронного кода в моей библиотеке twbotlib (https://github.com/truedl/twbotlib).

Я попробовал асинхронные команды несколько версий назад, и все прошло хорошо, но я не проверяю, действительно ли асинхронно. Затем я попытался создать бесплатную команду и использовать await asyncio.sleep(5). Я понял, что блокирует весь мой другой код ...

После многих попыток поиграть с асинхронным кодом, я не достигаю результата, работает без блокировки ...

(Мой класс Bot в main.py имеет атрибут, который называется self.loop и фактически является asyncio.get_event_loop)

Я не знаю, правильно ли я все делаю, потому что я сразу после вызова функции Run вызываю все последующие операции с помощью await.

Я пытался заменить ожидание на ожидание self.loop.create_task (foo). Я пытался сделать ожидание self.loop.ensure_future (foo) но ничего ...

Я тоже пытался разделить код на две функции (mainloop и check_data).

Прежде всего в коде есть функция Run, здесь я запускаю цикл (просто создаю задачу и run_forever):

    def run(self, startup_function=None) -> None:
        """ Run the bot and start the main while. """

        self.loop.create_task(self.mainloop(startup_function))
        self.loop.run_forever()

Во-вторых, здесь функция mainloop (все функции await блокируются ...):

    async def mainloop(self, startup_function) -> None:
        """ The main loop that reads and process the incoming data. """

        if startup_function:
            await startup_function()

        self.is_running = True
        while self.is_running:
            data = self.sock.recv(self.buffer).decode('utf-8').split('\n')
            await self.check_data(data)

И последний из них - check_data (разделен на mainloop [я заменил длинное if на «условие» для удобства чтения), здесь также ожидание блокируется):

    async def check_data(self, data: str) -> None:
        for line in data:
            if confition:
                message = self.get_message_object_from_str(line)
                if condition:
                    if condition:
                        await self.commands[message.command](message, message.args)
                    else:
                        await self.commands[message.command](message)
                elif hasattr(self.event, 'on_message'):
                    await self.event.on_message(message)
            if self.logs:
                print(line)

Нет сообщения об ошибке. Код блокируется, и я пытаюсь изменить его, чтобы не блокировать код.

1 Ответ

0 голосов
/ 30 июня 2019

Цикл for line in data: блокирует ваш код.

...