适用于 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 异常

http://paste.openstack.org/show/284115/

[2] os.fork 仅在 Unix 上可用。

https://docs.pythonlang.cn/2/library/os.html#os.fork

[3] multiprocessing 模块

http://sebastianraschka.com/Articles/2014_multiprocessing_intro.html

[4] Cygwin

https://www.cygwin.com/

[5] Cygwin fork 问题

http://cygwin.com/cygwin-ug-net/highlights.html#ov-hi-process

注意

本作品采用知识共享署名 3.0 非移植许可协议授权。 http://creativecommons.org/licenses/by/3.0/legalcode