python gevent.pool在1个线程上运行

时间:2015-05-01 03:04:19

标签: python multithreading multiprocessing threadpool gevent

我的代码运行一个任务池,当我监视活动时,其中一个cpu(更像是其中一个线程)达到90%,我希望更多地工作"多线程"并且在线程之间传播任务而不是在1个线程上工作。

gevent lib在核心级别而不是线程上工作?任何其他方式来创建池并将其传播到线程上?

group = gevent.pool.Pool(size=18)
for url in urls:
    group.spawn(scrap_content, url)
group.join()

2 个答案:

答案 0 :(得分:0)

Python基本上是单线程的。 gevent的作用是为您提供更好的界面来处理异步io。

如果您需要将计算密集型工作分散到多个cpu,则应检查multiprocessing module

答案 1 :(得分:0)

Gevent使用greenlets,它们是协程,而不是线程。看到一切只在一个CPU上运行是绝对正常的。

请注意,即使您在Python中使用线程,您仍然会看到它仅在一个CPU上运行,因为CPython(Python的标准实现)不支持在不同CPU上进行多线程处理。

原因是臭名昭着的GIL(全球翻译锁定)。 Python的核心不是线程安全的,因为它进行垃圾收集的方式,所以它使用一个锁,这意味着访问python对象的线程一个接一个地运行。

如果你需要在多个CPU上进行真正的多线程处理,请查看Cython(不要与CPython混淆)和“no_gil”,或c-extensions,或多处理模块。