asyncio多线程操作:run_coroutine_threadsafe(coro, loop)

目的:实现asyncio异步的多线程

函数:run_coroutine_threadsafe(coro, loop):

将协程提交给给定的事件循环。线程安全。

返回 concurrent.futures.Future 以等待来自另一个 OS 线程的结果。

此函数意在从与运行事件循环的操作系统线程不同的操作系统线程中调用。例子:

import asyncio, time, threading

async def main(i): 
    while True:
        await asyncio.sleep(1)
        print(i)

async def production_task():
    for i in "123":
        # 将不同参数main这个协程循环注册到运行在线程中的循环,
        # thread_loop会获得一循环任务
        asyncio.run_coroutine_threadsafe(main(i),thread_loop)
        # 注意:run_coroutine_threadsafe 这个方法只能用在运行在线程中的循环事件使用

def start_loop(thread_loop):
     #  运行事件循环, loop以参数的形式传递进来运行
    asyncio.set_event_loop(thread_loop)
    thread_loop.run_forever()

if __name__ == '__main__':
    
    # 获取一个事件循环
    thread_loop = asyncio.new_event_loop()
    # 将次事件循环运行在一个线程中,防止阻塞当前主线程,运行线程,同时协程事件循环也会运行
    threading.Thread(target=start_loop,args=(thread_loop,)).start()
    
    # 将生产任务的协程注册到这个循环中
    advocate_loop = asyncio.get_event_loop()
    # 运行次循环
    advocate_loop.run_until_complete(production_task())

asyncio就是遍历event_loop获取消息,是一个单线程阻塞函数。
在遍历循环过程中如果遇到某个协程阻塞就会卡住,一直等待结果返回,这时候就需要用到多线程防止阻塞。run_coroutine_threadsafe函数在新线程中建立新event_loop,可以动态添加协程,

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

奔跑的蜗牛..

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值