我正在使用 Python3 Asyncio 模块来创建负载平衡应用程序。我有两个繁重的 IO 任务:
- 一个 SNMP 轮询模块,用于确定可能的最佳服务器
- 一个“类似代理”的模块,用于平衡对选定服务器的请求。
两个进程将永远运行,彼此独立,不应被另一个进程阻塞。
我不能使用 1 个事件循环,因为它们会互相阻塞,有没有办法拥有 2 个事件循环或者我必须使用多线程/处理?
我尝试使用 asyncio.new_event_loop() 但没有成功。
最佳答案
asyncio
的全部意义在于你可以同时运行数千个 I/O 繁重的任务,所以你根本不需要 Thread
,这个这正是 asyncio
的用途。只需在同一个循环中运行两个协程(SNMP 和代理)即可。
在调用 loop.run_forever()
之前,您必须使它们都可用于事件循环。像这样的:
import asyncio
async def snmp():
print("Doing the snmp thing")
await asyncio.sleep(1)
async def proxy():
print("Doing the proxy thing")
await asyncio.sleep(2)
async def main():
while True:
await snmp()
await proxy()
loop = asyncio.get_event_loop()
loop.create_task(main())
loop.run_forever()
我不知道你的代码结构,所以不同的模块可能有自己的无限循环之类的东西,在这种情况下你可以这样运行:
import asyncio
async def snmp():
while True:
print("Doing the snmp thing")
await asyncio.sleep(1)
async def proxy():
while True:
print("Doing the proxy thing")
await asyncio.sleep(2)
loop = asyncio.get_event_loop()
loop.create_task(snmp())
loop.create_task(proxy())
loop.run_forever()
请记住,snmp
和 proxy
都需要以异步感知方式编写的协程 (async def
)。 asyncio
不会让简单的阻塞 Python 函数突然“异步”。
在您的具体情况下,我怀疑您有点困惑(无意冒犯!),因为编写良好的异步模块永远不会在同一个循环中相互阻塞。如果是这种情况,您根本不需要 asyncio
,只需在单独的 Thread
中运行其中一个,而无需处理任何 asyncio
东西。
关于python - Asyncio 两个循环用于不同的 I/O 任务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31623194/