Gevent多核使用

27 投票
1 回答
11706 浏览
提问于 2025-04-17 20:13

我刚开始学习Python的gevent库,想了解一下这个库是怎么使用CPU和多核的。

我尝试了一些例子,通过修改过的urllib发送很多请求,发现这些请求只在一个核心上运行,负载达到了99%。

我该如何在使用Python的gevent时,让所有核心都能工作呢?有没有什么好的做法?使用多个进程和gevent会有什么副作用吗?

祝好,
dan

1 个回答

62

Gevent让你可以处理那些会阻塞的请求,但它并不能让你在多核处理器上运行。

在任何时候,一个Python进程里只会有一个绿色线程(gevent的协程)在运行。gevent的真正好处在于它在处理I/O瓶颈时非常强大(这通常是一般网页应用、提供API的网页应用、网页聊天应用或后端应用,以及一般的网络应用所面临的情况)。如果我们在做一些需要大量CPU计算的事情,使用gevent就不会有性能提升。当一个应用受限于I/O时,gevent简直就是魔法。

有一个简单的规则:当进行I/O操作时,如果会阻塞,绿色线程就会被切换走,或者你可以手动切换(比如用gevent.sleep())。

Python内置的线程实际上和gevent的绿色线程表现得很像,都是以一种“伪”并发的方式运行。

关键的区别在于:绿色线程使用的是协作式多任务,而线程使用的是抢占式多任务。这意味着,绿色线程不会停止执行并“让出”给另一个绿色线程,除非它使用某些“让出”的函数(比如gevent.socket.socket.recv或gevent.sleep)。

而线程则会根据操作系统决定何时切换,随机地让出给其他线程。

最后,如果你想在Python中利用多核处理器,我们需要依赖多进程模块(这是Python内置的模块)。这个模块可以“绕过GIL”。其他的选择包括使用Jython,或者通过任务队列在不同的CPU上并行执行任务,比如Zeromq。

我在这里写了一个很长的解释 - http://learn-gevent-socketio.readthedocs.org/en/latest/。如果你想深入了解细节的话。:-D

撰写回答