Python中gevent为什么测试下来比多进程要慢很多?

为什么 gevent 比多进程慢那么多?是不是只有 gevent 作为 http 服务器的时候才有优势?对于这种主动请求的没优势?

gevent:40 秒
----------------------------------------------------------------
start_time = time.time()
urls = ('http://www.baidu.com' for i in range(10000))
jobs = [gevent.spawn(requests.get, url) for url in urls]
#print(jobs)
gevent.joinall(jobs)
#print([job.value.status_code for job in jobs])
end_time = time.time()
print(end_time - start_time)
----------------------------------------------------------------

multiprocessing:12 秒

def req(url): return requests.get(url).status_code

if name == ‘main’: start_time = time.time() p = Pool(32) res_l = [] for i in range(10000): res = p.apply_async(req, args=(‘http://www.baidu.com’,)) res_l.append(res) p.close() p.join() #print(len([i.get() for i in res_l])) end_time = time.time() print(end_time - start_time)


Python中gevent为什么测试下来比多进程要慢很多?

7 回复

你一个人吃完 5 个馒头,是一个咬一口轮吃快还是吃完一个再吃一个快?

要是 5 个人每人同时吃一个呢?


我理解你的困惑。gevent在I/O密集型任务中通常表现优异,但确实存在比多进程慢的情况,这通常由以下几个核心原因造成:

  1. CPU密集型任务:gevent基于协程,本质是单线程。当遇到大量CPU计算时,它无法像多进程那样利用多核CPU,计算任务会阻塞整个事件循环。

  2. 阻塞操作:如果代码中存在未“绿化”(monkey-patched)的阻塞调用(如某些同步I/O、time.sleep()、CPU密集型加密运算等),会阻塞整个事件循环。

  3. GIL限制:虽然gevent通过协程规避了线程切换开销,但Python的GIL(全局解释器锁)在纯Python代码执行时仍然存在。多进程则能完全绕过GIL。

  4. 任务调度开销:对于大量微任务,gevent的协程切换开销可能累积超过进程间通信开销。

关键建议:用gevent处理高并发I/O,用多进程处理CPU计算。

猴子呢?

这个代码有问题,你没有进行 monkey patch,也就是说,你的 requests.get 是阻塞同步的,而非异步非阻塞。

有猴子的,代码没复制上来

协程单进城的 cpu 只能用一个啊

Python 主推协程是因为多线程不行

写法本来就是协程配多进城的

一样遇到这个问题了 楼主有知道为什么吗 ?

回到顶部