首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >与uvloop等效的异步事件循环

与uvloop等效的异步事件循环
EN

Stack Overflow用户
提问于 2018-11-03 09:49:04
回答 1查看 7.6K关注 0票数 0

我有一个使用asyncio的协同线方法的事件循环。

我热衷于使用uvloop来寻找以下类似的示例。

下面是一个简单的asyncio事件循环示例:

代码语言:javascript
运行
复制
import asyncio

async def read(**kwargs):
    oid = kwargs.get('oid', '0.0.0.0.0.0')
    time = kwargs.get('time', 1)
    try:
        print('start: ' + oid)
    except Exception as exc:
        print(exc)
    finally:
        await asyncio.sleep(time)
        print('terminate: ' + oid)


def event_loop(configs):
    loop = asyncio.get_event_loop()

    for conf in configs:
        asyncio.ensure_future(read(oid=conf['oid'], time=conf['time']))

    return loop

if __name__ == '__main__':
    snmp_configurations = [
        {'time': 5, 'oid': '1.3.6.3.2.4'},
        {'time': 6, 'oid': '1.3.6.3.5.8'},
    ]  # TODO :: DUMMY
    loop = event_loop(snmp_configurations)
    try:
        loop.run_forever()
    except KeyboardInterrupt:
        pass
    finally:
        print("Closing Loop")
        loop.close()

问题:

  • 如何使用uvloop修改上述代码段
  • 如果使用性能更好的uvloop,下面的更改是否正确? 导入uvloop def event_loop: asyncio.set_event_loop_policy(uvloop.EventLoopPolicy()) # TODO ::uvloop。循环= asyncio.get_event_loop():asyncio.ensure_future(read( in = conf‘in’,time=conf'time'))返回循环

注意事项

  • uvloop声称这使得异步速度提高了2-4倍。
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-11-03 10:02:28

只需在调用asyncio.get_event_loop()之前设置事件循环策略即可。

代码语言:javascript
运行
复制
import asyncio
import uvloop
asyncio.set_event_loop_policy(uvloop.EventLoopPolicy())

async def read(**kwargs):
    oid = kwargs.get('oid', '0.0.0.0.0.0')
    time = kwargs.get('time', 1)
    try:
        print('start: ' + oid)
    except Exception as exc:
        print(exc)
    finally:
        await asyncio.sleep(time)
        print('terminate: ' + oid)


def event_loop(configs):
    loop = asyncio.get_event_loop()

    for conf in configs:
        asyncio.ensure_future(read(oid=conf['oid'], time=conf['time']))

    return loop

if __name__ == '__main__':
    snmp_configurations = [
        {'time': 5, 'oid': '1.3.6.3.2.4'},
        {'time': 6, 'oid': '1.3.6.3.5.8'},
    ]  # TODO :: DUMMY
    loop = event_loop(snmp_configurations)
    try:
        loop.run_forever()
    except KeyboardInterrupt:
        pass
    finally:
        print("Closing Loop")
        loop.close()

是的,这个代码是正确的。可以在导入后设置事件循环策略。

代码语言:javascript
运行
复制
import uvloop
import asyncio
asyncio.set_event_loop_policy(uvloop.EventLoopPolicy())  # TODO  :: uvloop.

def event_loop(configs):

    loop = asyncio.get_event_loop()

    for conf in configs:
        asyncio.ensure_future(read(oid=conf['oid'], time=conf['time']))

    return loop
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53130168

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档