当前位置: 首页 > 知识库问答 >
问题:

Python Asyncio: RuntimeEror:这个事件循环已经在运行

包唯
2023-03-14

我正在处理ayncio模块,在终止程序时遇到问题。我正在终端中运行我的程序,而Ctrl C无法停止正在运行的程序。但是,如果我关闭终端并再次尝试运行程序,我会遇到以下问题:

INFO:root:In main
ERROR:root:This event loop is already running

下面是我的示例代码以供理解。

# all_tasks.py

import asyncio
import logging
# module imports
import settings

#configure logging into a file
logging.basicConfig(filename=settings.LOG_FILENAME,level=logging.DEBUG)


class AsyncTest(object):

    async def taskOne(self):
        while True:
            print("Task One") # Print is just an example, I am doing lot of stuff inside.
            await asyncio.sleep(60)

    async def taskTwo(self):
        while True:
            print("Task Two") # Print is just an example, I am doing lot of stuff inside.
            await asyncio.sleep(60) 

    async def main(self):
        try:
            loop = asyncio.get_event_loop()
                tasks = [
                        asyncio.ensure_future(self.taskOne()),
                        asyncio.ensure_future(self.taskTwo()),
                        ]
            loop.run_until_complete(asyncio.wait(tasks))
        except RuntimeError as error:
            logging.info("In main")
            logging.error(error)

if __name__ == '__main__':
    asynctest = AsyncTest()
    asyncio.run(asynctest.main())

Config:windows10,python3.7.0

文件名:所有任务.py

命令:pythonall_tasks.py

非常感谢您的帮助。谢谢

共有1个答案

米飞龙
2023-03-14

asyncio.run创建并运行事件循环。您不应该创建和运行一个,尤其是在协程(用async def定义的函数)中。在协程中,您应该只等待某些东西。

相应地修改代码:

# ...

    async def main(self):
        tasks = [
            asyncio.ensure_future(self.taskOne()),
            asyncio.ensure_future(self.taskTwo()),
        ]
        await asyncio.wait(tasks)

if __name__ == '__main__':
    asynctest = AsyncTest()
    asyncio.run(asynctest.main())

会起作用的。

 类似资料:
  • 问题内容: 我有以下5个文件: gui.py functions.py 线程处理程序 variables.py 和start.py 执行start.py之后,我收到消息:“ QCoreApplication:exec:事件循环已在运行 ” 我发现,这与计时器有关 从 start.py 和功能 在 functions.py中 有人可以向我解释问题是什么吗?我不知道代码有什么问题… 问题答案: 我认为

  • 事件是应用程序与自身各个功能模块以及与操作系统进行通讯的手段,也是实现事件驱动编程模型的基础,应用程序如果要响应这些事件,通常是创建一个事件队列来集中存放它们,从事件队列取出事件并调用对应处理器就是一次事件响应,而往复执行这个操作的过程就是事件循环。 驱动接口 LCUI 对事件循环的操作有处理事件、绑定事件和解绑事件,驱动模块的职责就是基于操作系统接口向 LCUI 提供实现了这些操作的接口。首先我

  • 当我像这样做一个常规的while循环时 它打印 但第二个while循环在满足条件后再次运行。 所以结果是 “佛罗多是一个很好的霍比特人的名字”难道它不应该停止印刷吗 我设置了x的条件 编辑:哦,我现在明白了,哈哈,我想增量是在代码的末尾,开始是0

  • 问题内容: nodejs体系结构内部是否存在两个事件循环? libev / libuv v8 javascript事件循环 在I / O请求上,节点是否将请求排队到libeio,而libeio又通过使用libev的事件通知数据的可用性,最后这些事件由v8事件循环使用回调来处理? 基本上,libev和libeio如何集成到nodejs架构中? 是否有任何文档可以清楚地了解nodejs内部体系结构?

  • 主要内容:事件驱动程序,实例,Node 应用程序是如何工作的?Node.js 是单进程单线程应用程序,但是因为 V8 引擎提供的异步执行回调接口,通过这些接口可以处理大量的并发,所以性能非常高。 Node.js 几乎每一个 API 都是支持回调函数的。 Node.js 基本上所有的事件机制都是用设计模式中观察者模式实现。 Node.js 单线程类似进入一个while(true)的事件循环,直到没有事件观察者退出,每个异步事件都生成一个事件观察者,如果有事件发

  • nodejs架构中是否有两个内部事件循环? libev/libuv v8 javascript事件循环 在I/O请求时,node是否将请求排队发送到libeio,然后lib eio使用libev通过事件通知数据的可用性,最后这些事件由v8事件循环使用回调处理? 基本上,libev和libeio在nodejs架构中是如何集成的? 是否有任何留档可以提供nodejs内部架构的清晰图片?