多处理gevent扩展
geventmp的Python项目详细描述
警告
嗨,松鼠!!!
这个代码是非常实验性的(pre-pre-alpha)。很少有测试,很多东西都在变化, 有些平台根本不起作用。
不要在生产中使用。这段代码可能会使你的服务器崩溃,使你的公司破产,烧毁你的房子,变得卑鄙 给你的小狗。你被警告了。
问题
由于内部实现,多处理(mp)与Gevent一起使用是不安全的,即使monkey-patched。 也就是说,在mp中使用os信号量原语和进程间io将导致 循环到stall/deadlock/block(具体问题取决于cpython的版本)。
溶液
Geventmp(gee vent em pee,而不是gee vent tee em pee)是monkey patch子系统的扩展插件。 共Gevent。与monkey patch子系统的其他部分一样,这个过程相当清楚:
- 确定阻塞发生的所有位置以及阻塞可能导致循环暂停的位置。
- 如果文件描述符上发生阻塞(fd),请尝试将文件描述符从阻塞转换为非阻塞 (sockets/pipes/fifos,有时甚至是文件,很少是适当的),并用它们的 gevent非阻塞等价物。
- 如果阻塞发生在不支持非阻塞访问的python/os原语中,因此无法进行通风, 使用基于本机线程池的包装器包装对该原语的所有阻塞访问,并将其称为一天(同时完全 了解原始访问延迟将增加,原始性能可能因此受到影响)。
- 如果你真的很勇敢并且有很多空闲时间,完全替换一个标准的阻塞python 非基于fd的原语,其实现基于基于fd的os原语(例如posix信号量=>; Linux eventfd-based semaphore for kernels > 2.6.30)。
- 由于在mp中启动了不同的进程,所以要弄清楚如何、何时以及是否monkey patch生成/分叉 子孙后代。
安装
包托管在PyPi。
对于稳定版本:
pip install geventmp
对于不稳定版本:
pip install --pre geventmp
一旦安装,geventmp将在下面的节中默认激活。
frommonkeyimportpatch_allpatch_all()
如果希望geventmp在默认情况下不激活,请不要安装它或显式禁用它:
frommonkeyimportpatch_allpatch_all(geventmp=False)
就这样-到目前为止没有其他标志、设置、属性或配置值。
支持的平台
注意
所有的支持声明可能根本不是真实的。欢迎你来做实验。请参阅顶部的警告。
- Linux,可能是达尔文。
- cpython 2.7,3.5,3.6,3.7…也许吧。
待办事项
- 一旦我们知道Gevent Issue #1448是如何进行的,就实现ci/cd 外带。
- 对cpython 2.7、3.5、3.6、3.7、3.8、pypys等进行测试。
- 尽可能地修补窗口。
- 如果需要,测试并修复达尔文。
- 许多应用程序使用Billiard进行多处理,而不是使用常用的python 包裹。如果检测到猴子打台球。
联系我们
在Bug Tracker,Gitter上发布反馈和问题, 以及Twitter (@karelleninc)。