python coroutine_Python coroutine的坑

目前有个后端worker用的python 2.7写的,一次起10个gen.coroutine来跑黑盒的代码,这些代码很多是在做HTTP request。

在server端发现这些来自worker的lantency特别长。一番查找发现是http request的receive时间特别长,一般发4ms延迟,但是用这个就是40ms+。

做了一些测试后,定位为gen.coroutine跑代码的坑。

YY的原因:http基于tcp/ip,所以也有若干个回合的通信,一般发request,线程阻塞就挂起,收到就抢占读然后接着下一个包。

Python是单线程,coroutine所以是伪多协程,cpu调度里怀疑是严格的时间片轮转,即使一个coroutine已经被io阻塞了,依然占用cpu,不释放。所以10个协程,在轮询执行过程中,即使有的io已经可读,因为不能用cpu,所以被强行等待,也就是每一轮的通信都被延迟了。所以导致了这个问题。

简单看了下python3里的coroutine,可以做到挂起协程,用await的方法。

但是我们这个有一些特殊性,不能知道用户写的到底是啥,估计这个方法也不一定ok。另外也打算deprecate掉python,所以也不花时间改进了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 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
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值