2013-03-25 125 views
19

我刚刚开始使用python gevent,我在想库的cpu/mulitcore用法。Gevent多核使用

尝试通过monkeypatched urllib做许多请求的一些示例我注意到,它们仅使用99%的负载在一个内核上运行。

如何使用python使用gevent的所有内核? 有最佳做法吗?还是有任何使用多个进程和gevent的副作用?

BR 丹

回答

47

GEVENT给你处理阻止请求的能力。它不能让您在多核上运行。

在任何时候只有一个运行在python进程中的greenlet(gevent的协同程序)。 gevent的真正好处在于,它在处理I/O瓶颈时非常强大(对于一般Web应用程序,提供API端点的Web应用程序,基于Web的聊天应用程序或后端以及一般情况下的网络应用程序)。当我们做一些CPU大量的计算时,将会有使用gevent的性能增益no。当一个应用程序被I/O绑定时,gevent是纯粹的魔法。

有一个简单的规则:Greenlets得到切离每当一个I/O操作会阻塞或当你做开关明确地(例如用gevent.sleep())

内置的蟒蛇居然线程像gevent的greenlet一样以“同时”的方式运行。

关键区别在于 - greenlets使用协作式多任务处理,其中线程使用抢先式多任务处理。这意味着一个greenlet永远不会停止执行,并且“屈服”到另一个greenlet,除非它使用某些“产生”函数(如gevent.socket.socket.recv或gevent.sleep)。另一方面,线程将根据操作系统何时决定将其交换出去而产生给其他线程(有时是不可预知的)。

最后,利用Python中的多核心 - 如果这就是你想要的 - 我们必须依赖多处理模块(这是Python中的一个内置模块)。这个“绕过GIL”。其他选择包括使用Jython或使用任务队列并行执行任务(在不同的CPU上),例如, Zeromq。

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

+2

我可能会补充一点,根据情况,使用gevent运行几个Python进程可能是一个好的解决方案。当然,如果流程需要大量交流,这不是一种选择。 – ferrix 2013-03-25 14:51:05

+0

感谢您的回答。我想要的是在机器上执行尽可能多的I/O操作。问题是:我能够使用n个进程(而不是线程)执行更多的请求,其中n = cpu_cores或者是gevent,其进程尽可能快吗? – thesonix 2013-03-25 16:07:10

+1

下面是trunk.ly(用Alex Dong的话来说)如何处理I/O绑定和CPU绑定问题(他们抓取网站,然后将抓取的内容放入搜索索引中) - https://groups.google .com/d/msg/gevent/4hR1P6Vd-uk/4A4bw5ynuucJ – 2013-03-26 03:00:38