Я включил 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)
Нет сообщения об ошибке.
Код блокируется, и я пытаюсь изменить его, чтобы не блокировать код.