tornado.process — 多進程工具

用於處理多個進程的工具,包括將伺服器分叉為多個進程和管理子進程。

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,我們將分叉該特定數量的子進程。

由於我們使用進程而不是執行緒,因此任何伺服器程式碼之間都沒有共享記憶體。

請注意,多個進程與自動重新載入模組(或 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][原始碼]

傳回目前的任務 ID(如果有的話)。

如果此進程不是由 fork_processes 建立,則傳回 None。

class tornado.process.Subprocess(*args: Any, **kwargs: Any)[原始碼]

使用 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[原始碼]

當此進程結束時,執行 callback

回呼接受一個引數,即進程的傳回碼。

此方法使用 SIGCHLD 處理常式,這是一個全域設定,如果您有其他程式庫嘗試處理相同的訊號,可能會發生衝突。如果您使用多個 IOLoop,可能需要先呼叫 Subprocess.initialize,以指定一個 IOLoop 來執行訊號處理常式。

在許多情況下,stdout 或 stderr 串流上的關閉回呼可以用作結束回呼的替代方案,如果訊號處理常式造成問題。

可用性:Unix

wait_for_exit(raise_error: bool = True) Future[int][原始碼]

返回一個 Future,當進程結束時會解析(resolve)。

用法

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 處理常式。