tornado.process — 多进程实用工具

用于处理多个进程的实用工具,包括将服务器分叉到多个进程和管理子进程。

exception tornado.process.CalledProcessError[source]

subprocess.CalledProcessError 的别名。

tornado.process.cpu_count() int[source]

返回此机器上的处理器数量。

tornado.process.fork_processes(num_processes: Optional[int], max_restarts: Optional[int] = None) int[source]

启动多个工作进程。

如果 num_processes 为 None 或 <= 0,我们将检测此机器上可用的核心数量并分叉该数量的子进程。如果 num_processes 被给出且 > 0,我们将分叉该特定数量的子进程。

由于我们使用进程而不是线程,因此任何服务器代码之间没有共享内存。

请注意,多个进程与自动重新加载模块(或 tornado.web.Applicationautoreload=True 选项,该选项在 debug=True 时默认设置为 True)不兼容。使用多个进程时,在调用 fork_processes 之前,不能创建或引用任何 IOLoop。

在每个子进程中,fork_processes 返回其任务 ID,一个介于 0 和 num_processes 之间的数字。异常退出(由于信号或非零退出状态)的进程将使用相同的 ID 重新启动(最多 max_restarts 次)。在父进程中,fork_processes 在所有子进程正常退出后调用 sys.exit(0)

max_restarts 默认值为 100。

可用性:Unix

tornado.process.task_id() Optional[int][source]

返回当前任务 ID(如果有)。

如果此进程不是由 fork_processes 创建的,则返回 None。

class tornado.process.Subprocess(*args: Any, **kwargs: Any)[source]

用 IOStream 支持包装 subprocess.Popen

构造函数与 subprocess.Popen 相同,但有以下附加内容

  • stdinstdoutstderr 可能具有值 tornado.process.Subprocess.STREAM,这将使结果 Subprocess 的相应属性成为 PipeIOStream。如果使用此选项,调用者负责在完成使用流后关闭流。

Subprocess.STREAM 选项以及 set_exit_callbackwait_for_exit 方法在 Windows 上不起作用。因此,在该平台上使用此类而不是 subprocess.Popen 毫无意义。

在版本 5.0 中更改: io_loop 参数(自版本 4.1 起已弃用)已被删除。

set_exit_callback(callback: Callable[[int], None]) None[source]

当此进程退出时运行 callback

回调函数接受一个参数,即进程的返回值。

此方法使用 SIGCHLD 处理程序,它是全局设置,如果您有其他库试图处理相同的信号,可能会发生冲突。如果您使用多个 IOLoop,则可能需要先调用 Subprocess.initialize 以指定一个 IOLoop 来运行信号处理程序。

在许多情况下,stdout 或 stderr 流上的关闭回调可以用作退出回调的替代方法,如果信号处理程序导致问题。

可用性:Unix

wait_for_exit(raise_error: bool = True) Future[int][source]

返回一个 Future,该 Future 在进程退出时解析。

用法

ret = yield proc.wait_for_exit()

这是一个协程友好的替代方案,用于 set_exit_callback(以及阻塞 subprocess.Popen.wait 的替代品)。

默认情况下,如果进程的退出状态非零,则会引发 subprocess.CalledProcessError。使用 wait_for_exit(raise_error=False) 来抑制此行为,并返回退出状态而不引发异常。

版本 4.2 中的新增功能。

可用性:Unix

classmethod initialize() None[source]

初始化 SIGCHLD 处理程序。

信号处理程序在 IOLoop 上运行,以避免锁定问题。请注意,用于信号处理的 IOLoop 不必与各个 Subprocess 对象使用的 IOLoop 相同(只要每个 IOLoops 都在单独的线程中运行)。

在版本 5.0 中更改: io_loop 参数(自版本 4.1 起已弃用)已被删除。

可用性:Unix

classmethod uninitialize() None[source]

移除 SIGCHLD 处理程序。