zoukankan      html  css  js  c++  java
  • 多线程配合协程

    协程配合线程

    asyncio.run_coroutine_threadsafe
    

    该方法的语法如下:

    asyncio.run_coroutine_threadsafe(coro, loop)
    

    其实在协程中也可以使用多线程,有时候我们需要在主线程中启动一个子线程去做别的任务,这个时候我们就要用到下面的方法了,先上一个流畅的Python中的代码。

    import time
    import asyncio
    from  threading import Thread
    
    now = lambda: time.time()
    
    
    def start_loop(loop):
        asyncio.set_event_loop(loop)
        loop.run_forever()
    
    
    async def do_some_work(x):
        print(f'Waiting {x}')
        await asyncio.sleep(x)
        print(f'Done after {x}s')
    
    
    def more_work(x):
        print(f'More work {x}')
        time.sleep(x)
        print('Finished more work {x}')
    
    
    start = now()
    # 主线程中创建一个 new_loop
    new_loop = asyncio.get_event_loop()
    # 创建子线程 在其中开启无限事件循环
    t = Thread(target=start_loop, args=(new_loop,))
    t.start()
    print(f'TIME: {time.time() - start}')
    
    # 在主线程中新注册协程对象
    # 这样即可在子线程中进行事件循环的并发操作 同时主线程又不会被 block 
    # 一共执行的时间大概在 6 s 左右 
    asyncio.run_coroutine_threadsafe(do_some_work(6), new_loop)
    asyncio.run_coroutine_threadsafe(do_some_work(4), new_loop)
    

    上述的例子,主线程中创建一个new_loop,然后在另外的子线程中开启一个无限事件循环。主线程通过run_coroutine_threadsafe新注册协程对象。这样就能在子线程中进行事件循环的并发操作,同时主线程又不会被block。一共执行的时间大概在6s左右

  • 相关阅读:
    1082 射击比赛 (20 分)
    1091 N-自守数 (15 分)
    1064 朋友数 (20 分)
    1031 查验身份证 (15 分)
    1028 人口普查 (20 分)
    1059 C语言竞赛 (20 分)
    1083 是否存在相等的差 (20 分)
    1077 互评成绩计算 (20 分)
    792. 高精度减法
    791. 高精度加法
  • 原文地址:https://www.cnblogs.com/c-x-a/p/10914235.html
Copyright © 2011-2022 走看看