【发布时间】:2015-07-25 05:12:20
【问题描述】:
我正在使用 Python3 Asyncio 模块来创建负载平衡应用程序。我有两个繁重的 IO 任务:
- 一个 SNMP 轮询模块,用于确定可能的最佳服务器
- 一个“类似代理”的模块,用于平衡对所选服务器的请求。
两个进程将永远运行,彼此独立,不应被另一个进程阻塞。
我不能使用 1 个事件循环,因为它们会互相阻塞,有没有办法拥有 2 个事件循环或者我必须使用多线程/处理?
我尝试使用 asyncio.new_event_loop() 但没有成功。
【问题讨论】:
-
如果设计得当,即使 Asyncio 协程运行在同一个循环上,它们也不会相互阻塞。 Asyncio 有效地在多个协程/任务之间来回切换,以提供并发的效果,即使使用单个线程也是如此。
-
@shongololo 但是如果我有一个使用“loop.run_forever()”运行的循环,它会阻塞循环,除非我停止它,否则我不能做任何其他事情。还是我理解错了?这就是我看到的行为......
-
不确定我是否完全理解这种困境。有什么东西阻止你在同一个循环中运行吗?当您的代码中遇到“yield from”点时,asyncio 将自动来回切换(在同一个循环中)。这基本上是 asyncio 的重点,它允许您在同一个循环内运行多个可能阻塞的协程,而不会阻塞另一个。
-
如果代理服务器一直在运行,它不能来回切换。代理侦听客户端请求并使它们异步,但另一个任务无法执行,因为这个任务永远服务。
-
asyncio 的全部意义在于您可以同时运行数千个 I/O 繁重的任务,因此您根本不需要线程,这正是 asyncio 的用途。只需在同一个循环中运行两个协程(SNMP 和代理)即可。在技术方面:在调用
loop.run_forever()之前,您必须使它们都可用于事件循环
标签: python python-3.x python-asyncio