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