适用于 Windows 的 Oslo 服务工作进程¶
https://blueprints.launchpad.net/oslo.service/+spec/ windows-oslo-service-workers
此蓝图的目标是实现一种允许 OpenStack 服务在 Windows 上运行的方式。
问题描述¶
目前,oslo_service 项目包含一些特定于 Linux 的实现,这使得它无法在 Windows 上使用。例如 service.ProcessLauncher,它使用
eventlet.greenio.GreenPipe,由于它尝试将管道设置为非阻塞模式,而 Windows 中不存在这种机制,因此无法使用。[1]
os.fork,该函数在 Windows 中不存在。[2]
提议的变更¶
fork 的替代方案是使用 multiprocessing 模块生成子进程,这可以避免 GIL 问题。[3]
Multiprocessing 模块在 Linux 系统上仍然会 fork 进程,这意味着行为将与当前实现保持一致。
建议的更改是让 service.ProcessLauncher 生成 multiprocessing.Process 对象作为服务工作进程。
备选方案¶
Cygwin 可以在 Windows 上使用 [3],它是一套工具,提供类似于“Windows 上的 Linux 发行版”的功能。
问题在于,Cygwin 中的 fork 已知存在问题且效率低下,因为它无法很好地映射到 WIN32 API 上。[4]
Impact on Existing APIs¶
无
安全影响¶
无
性能影响¶
无,功能和性能不应在 Linux 上发生变化。
Configuration Impact¶
无
开发人员影响¶
无
Testing Impact¶
单元测试。
CI 测试将由 Jenkins 为 Linux 和 Hyper-V CI 为 Windows 执行。
应针对 Python 2.7 和 3.4 进行测试,因为 multiprocessing 模块的实现差异很大。为了避免为特定 Python 版本引入回归,这是必要的。
实现¶
负责人¶
- 主要负责人
Claudiu Belu <cbelu@cloudbasesolutions.com>
里程碑¶
完成目标里程碑
工作项¶
按照建议的更改。
孵化¶
采用¶
当前使用 oslo_services 模块的服务。
库¶
oslo_service
预计 API 稳定¶
无
文档影响¶
无
依赖项¶
multiprocessing
Python 2.7 和 3.4 的版本可能不同。
参考资料¶
- [1] GreenIO 异常
- [2] os.fork 仅在 Unix 上可用。
- [3] multiprocessing 模块
http://sebastianraschka.com/Articles/2014_multiprocessing_intro.html
- [4] Cygwin
- [5] Cygwin fork 问题
http://cygwin.com/cygwin-ug-net/highlights.html#ov-hi-process
注意
本作品采用知识共享署名 3.0 非移植许可协议授权。 http://creativecommons.org/licenses/by/3.0/legalcode