我正在使用asyncio,但是async函数正在使用asyncio.sleep(5)

时间:2019-06-22 08:28:44

标签: python-3.x asynchronous python-asyncio

我在twbotlib(https://github.com/truedl/twbotlib)库中加入了异步代码异步处理。

我在某些版本上尝试了异步命令,并且一切正常,但是我没有检查是否真的是异步的。然后,我尝试创建一个赠品命令并使用await asyncio.sleep(5)。我意识到这会阻止我所有其他代码...

经过多次尝试使用asyncio代码后,我看不到结果正在运行且没有阻塞...

(main.py中的我的Bot类具有一个名为self.loop的属性,实际上是asyncio.get_event_loop)

我不知道我是否能正确完成所有操作,因为在调用Run函数之后,我会使用await调用所有以后的操作。

我尝试用 等待self.loop.create_task(foo)。 我试着做 等待self.loop.ensure_future(foo)但什么都没有...

我也试图将代码拆分为两个函数(mainloop和check_data)。

代码中首先是Run函数,在这里我开始循环(只需创建task和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(已拆分的主循环[为了可读性,我已将long if替换为“ condition”,在这里等待也阻塞了):

    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 :(得分:0)

循环for line in data:阻止了您的代码。