我的代码运行一个任务池,当我监控到其中一个cpu(更像是其中一个线程)的活动达到90%时,我希望工作更多的“多线程”,并在线程之间分配任务,而不是在一个线程上工作。
gevent lib在核心层而不是线程上工作?有没有其他方法可以创建池并将其分散到线程上?
group = gevent.pool.Pool(size=18)
for url in urls:
group.spawn(scrap_content, url)
group.join()发布于 2015-05-01 15:40:22
Python基本上是单线程的。gevent所做的就是为你提供一个更好的接口来使用async io。
如果需要将计算密集型工作分散到多个cpu上,则应该检查multiprocessing module
发布于 2015-06-26 05:05:31
Gevent使用greenlet,它是协程,而不是线程。看到所有的东西都只在一个CPU上运行是绝对正常的。
请注意,即使在Python语言中使用线程,您仍然会看到它只在一个CPU上运行,因为CPython ( Python的标准实现)不支持在不同CPU上运行多线程。
原因是臭名昭著的GIL (全局解释器锁)。python的核心不是线程安全的,因为它执行垃圾收集的方式,所以它使用锁,这意味着访问python对象的线程一个接一个地运行。
如果您需要在多个CPU上执行真正的多线程,请查看Cython (不要与CPython混淆)和"no_gil",或c扩展,或多处理模块。
https://stackoverflow.com/questions/29981091
复制相似问题