使用multiprocessing包实现的deferToProcess。
项目描述
简介
Python的全局解释器锁(GIL)通过锁定所有纯Python代码,对多处理器性能提出了一些限制。虽然twisted中的线程支持很出色,但GIL实际上将进程绑定到单个CPU,从而限制了性能。
为了绕过GIL,Python从2.6版本开始引入了multiprocessing包。multiprocessing包已回滚到Python 2.4和2.5,并可在Python包索引(http://pypi.python.org/pypi)中找到。multiprocessing包提供了与Python提供的线程库类似的接口,但它使用进程而不是线程。
本包twisted.internet.processes实现了对多进程库的封装,并提供了一个deferToProcess方法,其工作方式与deferToThread相同。
实现
当第一次调用deferToThread时,与在正常reactor中创建线程池的方式相同,在reactor上创建了一个进程池。
最初的目标是使用非阻塞代码和来自多进程库的回调来提供deferToProcess方法。不幸的是,multiprocessing.Pool.apply_async在失败时不会调用回调。为了保留失败回调,使用来自异步结果集multiprocessing.pool.AsyncResult的get方法,通过将其包装在deferToThread的调用中来使用。在等待来自单独进程的调用结果时,线程会被阻塞。
使用multiprocessing.Pool.apply_async来延迟到进程对用户代码施加一些额外要求。所有参数以及函数本身都必须能够被Python的cPickle模块序列化。
许可证
版权所有 2009 德克萨斯A&M大学
根据Apache许可证版本2.0(“许可证”);除非适用法律要求或经书面同意,否则不得使用此文件,除非符合许可证。您可以在以下位置获取许可证副本:
https://apache.ac.cn/licenses/LICENSE-2.0
除非适用法律要求或书面同意,否则在许可证下分发的软件按“原样”基础分发,不提供任何明示或暗示的保证或条件。有关许可证中规定的特定语言的权限和限制,请参阅许可证。
变更日志
1.0b1 2009/08/24
初始版本
由于2.6.2.1中的日志记录错误,锁定在multiprocessing 2.6.1.1或以下版本
尚未进行测试
deferToProcess基于deferToThread包装的阻塞调用
项目详情
twisted.internet.processes-1.0b1.tar.gz的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 32ddcab962ed1b418bc9a47fb93b99e9e60671caa50660fe9b1fd3ab2b53ba0d |
|
MD5 | cd28b1328b1aa7c235875f12b00bd44d |
|
BLAKE2b-256 | 22e83100c41ba21d5f34a345598adc86fe19e6eea91ca4810798caa3b477738f |