【问题标题】:asyncio event loop equivalent with uvloop与 uvloop 等效的异步事件循环
【发布时间】:2018-11-07 07:12:17
【问题描述】:

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

我热衷于使用uvloop 寻找以下示例的等效项。

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

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上面的sn-p代码?

  • 以下更改对于使用具有更高性能的uvloop 是否正确?

    import uvloop
    
    def event_loop(configs):
        asyncio.set_event_loop_policy(uvloop.EventLoopPolicy())  # TODO  :: uvloop.
        loop = asyncio.get_event_loop()
    
     `   for conf in configs:
            asyncio.ensure_future(read(oid=conf['oid'], time=conf['time']))
    
        return loop
    

[注意]:

  • uvloop 声称使 asyncio 速度提高了 2-4 倍。

【问题讨论】:

    标签: python python-3.x async-await python-asyncio uvloop


    【解决方案1】:

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

    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()
    

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

    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
    

    【讨论】:

    • 谢谢解答,但是真的会对其性能提升有影响吗?
    • @BenyaminJafari 我从未在生产中使用过uvloopThis 可能会有所帮助。
    • uvloop 声称它的速度比 asyncio 快 2-4 倍。所以我将使用uvloop 和纯asyncio 进行分析。 +1
    • @BenyaminJafari 这些基准永远不会告诉您,您的应用程序运行速度有多快。测试一下。
    • 不,我的意思是通过使用纯 asynciouvloop 在我的实际代码中使用真实数据获得基准并在它们之间进行选择。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-07-07
    • 1970-01-01
    • 1970-01-01
    • 2020-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多