Python Tornado入门教程 Tornado 多进程的实用程序

2024-02-25 开发教程 Python Tornado入门教程 匿名 2

用于处理多个进程的实用程序,包括将服务器分为多个进程和管理子进程。

exception tornado.process.CalledProcessError

subprocess.CalledProcessError​ 的别名。

tornado.process.cpu_count() → int

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

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

启动多个工作进程。

如果 ​num_processes为 None 或 <= 0,我们会检测这台机器上可用的内核数量并派生该数量的子进程。 如果给定 ​num_processes并且 > 0,我们将fork特定数量的子进程。

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

请注意,多个进程与 ​autoreload模块(或 ​tornado.web.Application​ 的 ​autoreload=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]

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

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

class tornado.process.Subprocess(*args, **kwargs)

使用 ​IOStream包装 ​subprocess.Popen​。

构造函数与 ​subprocess.Popen​ 相同,但添加了以下内容:

stdin​、​stdout和 ​stderr可能具有值 ​tornado.process.Subprocess.STREAM​,这将使生成的 ​Subprocess的相应属性成为 ​PipeIOStream​。 如果使用此选项,调用者负责在完成Stream时关闭Stream。

Subprocess.STREAM​ 选项以及 ​set_exit_callback​ 和 ​wait_for_exit​ 方法在 Windows 上不起作用。 因此,没有理由在该平台上使用此类而不是 ​subprocess.Popen​。

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

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

此进程退出时运行回调。

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

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

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

可用性:​Unix

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

返回一个 ​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

初始化 ​SIGCHLD处理程序。

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

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

可用性:​Unix

classmethod uninitialize() → None

删除 ​SIGCHLD ​处理程序。