python - Asyncio 两个循环用于不同的 I/O 任务?

标签 python python-3.x python-asyncio

我正在使用 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()

请记住,snmpproxy 都需要以异步感知方式编写的协程 (async def)。 asyncio 不会让简单的阻塞 Python 函数突然“异步”。

在您的具体情况下,我怀疑您有点困惑(无意冒犯!),因为编写良好的异步模块永远不会在同一个循环中相互阻塞。如果是这种情况,您根本不需要 asyncio,只需在单独的 Thread 中运行其中一个,而无需处理任何 asyncio 东西。

关于python - Asyncio 两个循环用于不同的 I/O 任务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31623194/

相关文章:

python - 是否可以在 Pymongo 中创建一个没有游标超时的聚合?

python - 使用 Matplotlib 缩放直方图上的第二个轴

python - scikit-learn OpenMP libsvm

python - 用元组生成索引

Python 3 异步 : run_until_complete() blocks when waiting for ProcessPoolExecutor job done

python - AWS lambda 与 python asyncio。事件循环关闭问题?

python - 一种改变 asyncio 任务应该如何从调用 cancel() 的地方被取消的 Pythonic 方法

python - 从 Pypi 中删除包版本

python-3.x - 当批量大小发生变化时如何计算类(class)分数

python - 使用 Python 请求 POST 提交表单数据不起作用