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,可以动态添加协程,

 

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,下面是一个关于使用 `asyncio.run_coroutine_threadsafe()` 进行消息队列入队出队的示例: ```python import asyncio import queue # 创建一个消息队列 message_queue = queue.Queue() # 定义一个协程,用于从队列中获取消息 async def consume_message(): while True: # 从队列中获取消息 message = message_queue.get() # 处理消息 print("Consumed message:", message) # 定义一个函数,用于将消息发送到队列中 def send_message(message): # 将消息推入队列 message_queue.put(message) # 在事件循环中异步调用 consume_message() 协程 asyncio.run_coroutine_threadsafe(consume_message(), loop) # 创建一个事件循环 loop = asyncio.get_event_loop() # 启动消费者协程 asyncio.ensure_future(consume_message()) # 发送一些消息 send_message("Hello, world!") send_message("How are you?") send_message("Goodbye!") # 运行事件循环 loop.run_forever() ``` 在上面的示例中,我们首先创建了一个简单的消息队列 `message_queue`。然后,我们定义了一个协程 `consume_message()`,它会从队列中获取消息并进行处理。 接下来,我们定义了一个函数 `send_message()`,用于将消息发送到队列中。在这个函数中,我们首先将消息推入队列中,然后使用 `asyncio.run_coroutine_threadsafe()` 方法在事件循环中异步调用 `consume_message()` 协程。 最后,我们创建一个事件循环,并使用 `asyncio.ensure_future()` 启动消费者协程。然后,我们调用 `send_message()` 函数发送一些消息,并运行事件循环。在事件循环中,我们将一直等待新的消息,并使用 `consume_message()` 协程进行处理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

奔跑的蜗牛..

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

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

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

打赏作者

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

抵扣说明:

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

余额充值