最新公告
  • 欢迎您光临网站无忧模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • 深究Python中的asyncio库-线程同步

    正文概述    2020-04-18   304

    前面的代码都是异步的,就如sleep,需要用asyncio.sleep而不是阻塞的time.sleep,如果有同步逻辑,怎么利用asyncio实现并发呢?答案是用run_in_executor。在一开始我说过开发者创建 Future 对象情况很少,主要是用run_in_executor,就是让同步函数在一个执行器( executor)里面运行。

    深究Python中的asyncio库-线程同步

    同步代码

    def a():
        time.sleep(1)
        return 'A'
    async def b():
        await asyncio.sleep(1)
        return 'B'
    def show_perf(func):
        print('*' * 20)
        start = time.perf_counter()
        asyncio.run(func())
        print(f'{func.__name__} Cost: {time.perf_counter() - start}')
    async def c1():
        loop = asyncio.get_running_loop()
        await asyncio.gather(
            loop.run_in_executor(None, a),
            b()
        )
    In : show_perf(c1)
    ********************
    c1 Cost: 1.0027242230000866

    可以看到用run_into_executor可以把同步函数逻辑转化成一个协程,且实现了并发。这里要注意细节,就是函数a是普通函数,不能写成协程,下面的定义是错误的,不能实现并发:

    async def a():
        time.sleep(1)
        return 'A'

    因为 a 里面没有异步代码,就不要用async def来定义。需要把这种逻辑用loop.run_in_executor封装到协程:

    async def c():
        loop = asyncio.get_running_loop()
        return await loop.run_in_executor(None, a)

    大家理解了吧?

    loop.run_in_executor(None, a)这里面第一个参数是要传递concurrent.futures.Executor实例的,传递None会选择默认的executor:

    In : loop._default_executor
    Out: <concurrent.futures.thread.ThreadPoolExecutor at 0x112b60e80>

    当然我们还可以用进程池,这次换个常用的文件读写例子,并且用:

    async def c3():
        loop = asyncio.get_running_loop()
        with concurrent.futures.ProcessPoolExecutor() as e:
            print(await asyncio.gather(
                loop.run_in_executor(e, a),
                b()
            ))
    In : show_perf(c3)
    ********************
    ['A', 'B']
    c3 Cost: 1.0218078890000015

    下一节:深究Python中的asyncio库-线程池


    下载网 » 深究Python中的asyncio库-线程同步

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元