我刚刚开始使用python gevent,我想知道库的cpu / mulitcore使用情况。
尝试通过monkeypatched urllib执行许多请求的一些示例我注意到,它们只使用99%的负载在一个核心上运行。
如何使用python使用gevent的所有内核? 有最好的做法吗?或者是否存在使用多个进程和gevent的任何副作用?
BR 担
答案 0 :(得分:54)
Gevent使您能够处理阻止请求。它不能让你在多核上运行。
任何时候都只有一个greenlet(gevent的coroutine)在python进程中运行。 gevent的真正好处在于它在处理I / O瓶颈时非常强大(通常是一般网络应用程序,服务API端点的Web应用程序,基于Web的聊天应用程序或后端,以及通常的网络应用程序) )。当我们进行一些CPU繁重的计算时,使用gevent会有 no 性能增益。当应用程序被I / O绑定时,gevent就是纯粹的魔法。
有一个简单的规则:当I / O操作阻塞或明确切换时,Greenlets会被切换掉(例如使用gevent.sleep())
内置的python线程实际上与gevent的greenlets具有相同的(伪)“并发”方式。
关键区别在于 - greenlets使用协作式多任务处理,其中线程使用抢先式多任务处理。这意味着greenlet永远不会停止执行并“屈服”到另一个greenlet,除非它使用某些“让步”函数(如gevent.socket.socket.recv或gevent.sleep)。
另一方面,线程将根据操作系统决定将它们交换出来而屈服于其他线程(有时是不可预测的)。最后,在Python中使用多核 - 如果这就是你想要的 - 我们必须依赖于多处理模块(这是Python中的内置模块)。这“绕过GIL”。其他替代方案包括使用Jython或使用任务队列并行(在不同的CPU上)执行任务,例如, Zeromq。
我在这里写了很长的解释 - http://learn-gevent-socketio.readthedocs.org/en/latest/。如果你想深入细节。 :-D