the*_*nix 23 python multiprocessing gevent
我刚刚开始使用python gevent,我想知道库的cpu/mulitcore使用情况.
尝试通过monkeypatched urllib执行许多请求的一些示例我注意到,它们只使用99%的负载运行在一个核心上.
如何使用python使用gevent的所有核心?有最好的做法吗?或者是否存在使用多个过程和gevent的任何副作用?
BR dan
Cal*_*eng 55
Gevent使您能够处理阻止请求.它不能让你在多核上运行.
任何时候都只有一个greenlet(gevent的coroutine)在python进程中运行.gevent的真正好处在于它在处理I/O瓶颈时非常强大(通常情况下,一般网络应用程序,服务API端点的Web应用程序,基于Web的聊天应用程序或后端,以及一般情况下,网络应用程序).当我们进行一些CPU繁重的计算时,使用gevent 将没有性能提升.当应用程序是I/O绑定时,gevent是纯粹的魔法.
有一个简单的规则:每当I/O操作阻塞或明确切换时,Greenlet就会被切换掉(例如使用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