ℹ️ Skipped - page is already crawled
| Filter | Status | Condition | Details |
|---|---|---|---|
| HTTP status | PASS | download_http_code = 200 | HTTP 200 |
| Age cutoff | FAIL | download_stamp > now() - 6 MONTH | 7.8 months ago |
| History drop | PASS | isNull(history_drop_reason) | No drop reason |
| Spam/ban | PASS | fh_dont_index != 1 AND ml_spam_score = 0 | ml_spam_score=0 |
| Canonical | PASS | meta_canonical IS NULL OR = '' OR = src_unparsed | Not set |
| Property | Value |
|---|---|
| URL | https://kazuki-nagasawa.hatenablog.com/entry/memo_20151205_python_multiprocess_signal |
| Last Crawled | 2025-08-15 03:06:43 (7 months ago) |
| First Indexed | not set |
| HTTP Status Code | 200 |
| Meta Title | Python で Multi process (して、更に Signal で安全に終了させる) - 雑食性雑感雑記 |
| Meta Description | Python のマルチプロセス実装を試してみました。 合わせて、Signal で安全にプロセスを落とせるようにしてみました。 |
| Meta Canonical | null |
| Boilerpipe Text | この広告は、90日以上更新していないブログに表示しています。 |
| Markdown | # [雑食性雑感雑記](https://kazuki-nagasawa.hatenablog.com/)
## 知識の整理場。ため込んだ知識をブログ記事として再構築します。
この広告は、90日以上更新していないブログに表示しています。
[2015\-12\-05](https://kazuki-nagasawa.hatenablog.com/archive/2015/12/05)
# [Python で Multi process (して、更に Signal で安全に終了させる)](https://kazuki-nagasawa.hatenablog.com/entry/memo_20151205_python_multiprocess_signal)
[Python](https://kazuki-nagasawa.hatenablog.com/archive/category/Python) [マルチプロセス](https://kazuki-nagasawa.hatenablog.com/archive/category/%E3%83%9E%E3%83%AB%E3%83%81%E3%83%97%E3%83%AD%E3%82%BB%E3%82%B9) [Multi process](https://kazuki-nagasawa.hatenablog.com/archive/category/Multi%20process)
### 概要
- Python のマルチプロセス実装を試してみた。
- 更に、signal を取り入れて「Ctrl + C」や「kill」で安全に全プロセスを終了させるようにしてみた。
### 実験環境
- Linux (CentOS 7)
- Python 2.7
### サンプルコード概要
#### メインプロセス
- 3つのサブプロセスを立ち上げ、その後シグナル待ち。
- シグナルを受信したら、終了フラグを投げてサブプロセス終了待ち。
- サブプロセス全部終わったら終了。
#### サブプロセス 1
- inc queue に数字を詰め込み、sleep。を繰り返す。
- 終了フラグ受信したら終了。
#### サブプロセス 2
- inc queue から数字を取得し、掛け算して mul queue に詰め込んで、sleep。を繰り返す。
- 終了フラグ受信したら終了。
#### サブプロセス 3
- mul queue からデータを取得して print し、sleep。を繰り返す。
- 終了フラグ受信したら終了。
### 実行結果
#### 通常実行し、Ctrl + C で終了してみる。
```
$ python execute.py
Start subprocess 1...
Start subprocess 3...
Start subprocess 2...
Value : 2
Value : 4
Value : 6
Value : 8
Value : 10
Value : 12
Value : 14
( ここで Ctrl + C )
Stop subprocess 2.
Stop subprocess 3.
Stop subprocess 1.
Complete !!!
```
- sleep のタイミング等あり、終わる順番は一意でない。
#### nohup でバックグラウンド実行し、後で kill してみる。
```
$ nohup python execute.py $
( 別コンソール )
$ ps ax | grep python
17143 pts/0 S 0:00 python execute.py
17144 pts/0 Sl 0:00 python execute.py
17145 pts/0 Sl 0:00 python execute.py
17146 pts/0 S 0:00 python execute.py
17199 pts/1 S+ 0:00 grep --color=auto python
$ kill 17143
$ ps ax | grep python
17199 pts/1 S+ 0:00 grep --color=auto python
( => 正常にスクリプト終了した!! )
```
### ソースコード (概要)
#### サブプロセス
- クラス化した。子プロセス処理は「run」メソッド。
- self も使える。
- run メソッド内で、シグナルを無効にしておく。(メインからのstop\_flagで終了させるので。)
```
import time
class SubProcess(object) :
def __init__(self) :
# 初期化
pass
def run(self, queue, stop_flag) :
signal.signal(signal.SIGINT, signal.SIG_IGN)
signal.signal(signal.SIGTERM, signal.SIG_IGN)
# 子プロセス処理、ループ回す。
while True :
if stop_flag.is_set() :
break
time.sleep(0.01)
```
#### メインプロセス
- Queue、Event 定義、サブプロセス定義。
```
from multiprocessing import Process, Queue, Event
if __name__ == '__main__' :
queue = Queue()
stop_flag = Event()
sub = SubProcess()
sub_process = Process(target = sub.run, args = (queue, stop_flag))
```
- サブプロセス実行してシグナル受信待ち。シグナル受信したら stop\_flag 設定。
```
processes = [sub_process]
for p in processes :
p.start()
def signalHandler(signal, handler) :
stop_flag.set()
signal.signal(signal.SIGINT, signalHandler)
signal.signal(signal.SIGTERM, signalHandler)
signal.pause()
```
- シグナル受信後のサブプロセス終了待ち。
```
for p in processes :
p.join()
for p in processes :
p.terminate()
```
### ソースコード全文
```
# -*- coding: utf-8 -*-
"""
Multi process サンプル
複数のプロセスを立ち上げ、Ctrl + C や kill で安全に終了するサンプル。
プロセス 1
inc_q に 数字を詰め込み、sleep する。
プロセス 2
inc_q からデータを取得し、掛け算して mul_q に詰め込む。sleep する。
プロセス 3
mul_q からデータを取得して、print する。
"""
import signal
import time
from multiprocessing import Process, Queue, Event
##############################
### Settings ###
##############################
# 休息時間 (秒)
SLEEP_SEC = 1
##############################
### Sub processes ###
##############################
class SubProcess1(object) :
def __init__(self) :
self.first = 0
self.step = 1
def run(self, inc_q, stop_flag) :
### Signal disable
signal.signal(signal.SIGINT, signal.SIG_IGN)
signal.signal(signal.SIGTERM, signal.SIG_IGN)
print "Start subprocess 1..."
count = 0
while True :
if stop_flag.is_set() :
break
count += 1
inc_q.put(self.first + self.step * count)
time.sleep(SLEEP_SEC)
print "Stop subprocess 1."
class SubProcess2(object) :
def __init__(self) :
self.coef = 2
def run(self, inc_q, mul_q, stop_flag) :
### Signal disable
signal.signal(signal.SIGINT, signal.SIG_IGN)
signal.signal(signal.SIGTERM, signal.SIG_IGN)
print "Start subprocess 2..."
while True :
if stop_flag.is_set() :
break
if not inc_q.empty() :
value = inc_q.get()
mul_q.put(value * self.coef)
time.sleep(SLEEP_SEC)
print "Stop subprocess 2."
class SubProcess3(object) :
def __init__(self) :
self.temp = "Value : {0}"
def run(self, mul_q, stop_flag) :
### Signal disable
signal.signal(signal.SIGINT, signal.SIG_IGN)
signal.signal(signal.SIGTERM, signal.SIG_IGN)
print "Start subprocess 3..."
while True :
if stop_flag.is_set() :
break
if not mul_q.empty() :
value = mul_q.get()
print self.temp.format(value)
time.sleep(SLEEP_SEC)
print "Stop subprocess 3."
##############################
### Main ###
##############################
if __name__ == '__main__' :
### Queue
inc_q = Queue()
mul_q = Queue()
### Event
stop_flag = Event()
### Sub processes
sub1 = SubProcess1()
sub2 = SubProcess2()
sub3 = SubProcess3()
sub1_process = Process(target = sub1.run, args = (inc_q, stop_flag))
sub2_process = Process(target = sub2.run, args = (inc_q, mul_q, stop_flag))
sub3_process = Process(target = sub3.run, args = (mul_q, stop_flag))
### Start sub processes
processes = [sub1_process, sub2_process, sub3_process]
for p in processes :
p.start()
### Signal settings
def signalHandler(signal, handler) :
stop_flag.set()
signal.signal(signal.SIGINT, signalHandler)
signal.signal(signal.SIGTERM, signalHandler)
### Wait subprocess stop
# (2016/02/04) 追加。こっちで子プロセス終了待ちした方が賢明な気がしてる。
while True :
alive_flag = False
for p in processes :
if p.is_alive() :
alive_flag = True
break
if alive_flag :
time.sleep(0.1)
continue
break
"""
# (2016/02/04)
# 修正。join して terminate とかいれると終わらないことが orz...
signal.pause()
### Wait subprocess join
for p in processes :
p.join()
for p in processes :
p.terminate()
"""
print "Complete !!!"
```
- (2016/02/04) 修正。サブプロセスの待ちを「pause」を使わず、ずっと監視するようにした。
- (join → terminate してたせい?) たまに終わらないことがあったり。
- 無限ループじゃない仕組みの場合、pause 入っていると Ctrl + C を入れないと終わらなかったり。。。
### 参照
- [Python マルチプロセス](http://docs.python.jp/2.7/library/multiprocessing.html)
- [Python シグナル](http://docs.python.jp/2/library/signal.html)
kazuki\_nagasawa [2015-12-05 19:16](https://kazuki-nagasawa.hatenablog.com/entry/memo_20151205_python_multiprocess_signal)
[](https://b.hatena.ne.jp/entry/s/kazuki-nagasawa.hatenablog.com/entry/memo_20151205_python_multiprocess_signal "この記事をはてなブックマークに追加")
関連記事
- [2015-05-02](https://kazuki-nagasawa.hatenablog.com/archive/2015/05/02)
[Python threading 処理で高速化](https://kazuki-nagasawa.hatenablog.com/entry/memo_20150502_python_threading)
概要 Python のモジュール「Threading」を使って並列化処理を実…
[コメントを書く]()
- [もっと読む]()
[« Python で使うと便利なライブラリ (2016/0…](https://kazuki-nagasawa.hatenablog.com/entry/memo_20160818_python_libraries) [PythonのConfigParserでカッチリとしたコ… »](https://kazuki-nagasawa.hatenablog.com/entry/memo_20150617_python_config_parser)
プロフィール
[](https://kazuki-nagasawa.hatenablog.com/about) [id:kazuki\_nagasawa](https://kazuki-nagasawa.hatenablog.com/about) [*はてなブログPro*](https://blog.hatena.ne.jp/-/pro?plus_via=blog_plus_badge&utm_source=pro_badge&utm_medium=referral&utm_campaign=register_pro "はてなブログPro")
[読者です 読者をやめる 読者になる 読者になる](https://kazuki-nagasawa.hatenablog.com/entry/memo_20151205_python_multiprocess_signal)
[このブログについて](https://kazuki-nagasawa.hatenablog.com/about)
検索
リンク
- [自転車トレーニング日記](https://blog.yokosuka-longrider.jp/)
[最新記事](https://kazuki-nagasawa.hatenablog.com/archive)
- [【JavaScript & Canvas】Boids アルゴリズム 習作](https://kazuki-nagasawa.hatenablog.com/entry/memo_20221129_javascript_canvas_boids)
- [【JavaScript & Canvas】等速度運動のボールを弾ませてみる](https://kazuki-nagasawa.hatenablog.com/entry/memo_20221121_javascript_canvas_move_points_3)
- [【JavaScript & Canvas】一定間隔で更新する描画を作ってみる。(ライフゲーム)](https://kazuki-nagasawa.hatenablog.com/entry/memo_20221115_javascript_canvas_lifegame)
- [【JavaScript & Canvas】 投射と跳ね返り](https://kazuki-nagasawa.hatenablog.com/entry/memo_20221027_javascript_canvas_move_points_2)
- [【JavaScript & Canvas】 等速度運動と反射](https://kazuki-nagasawa.hatenablog.com/entry/memo_20221026_javascript_canvas_move_points)
[月別アーカイブ](https://kazuki-nagasawa.hatenablog.com/archive)
- ▼ ▶
[2022](https://kazuki-nagasawa.hatenablog.com/archive/2022)
- [2022 / 11](https://kazuki-nagasawa.hatenablog.com/archive/2022/11)
- [2022 / 10](https://kazuki-nagasawa.hatenablog.com/archive/2022/10)
- ▼ ▶
[2021](https://kazuki-nagasawa.hatenablog.com/archive/2021)
- [2021 / 11](https://kazuki-nagasawa.hatenablog.com/archive/2021/11)
- [2021 / 6](https://kazuki-nagasawa.hatenablog.com/archive/2021/06)
- ▼ ▶
[2020](https://kazuki-nagasawa.hatenablog.com/archive/2020)
- [2020 / 10](https://kazuki-nagasawa.hatenablog.com/archive/2020/10)
- [2020 / 5](https://kazuki-nagasawa.hatenablog.com/archive/2020/05)
- [2020 / 4](https://kazuki-nagasawa.hatenablog.com/archive/2020/04)
- ▼ ▶
[2018](https://kazuki-nagasawa.hatenablog.com/archive/2018)
- [2018 / 12](https://kazuki-nagasawa.hatenablog.com/archive/2018/12)
- [2018 / 11](https://kazuki-nagasawa.hatenablog.com/archive/2018/11)
- [2018 / 5](https://kazuki-nagasawa.hatenablog.com/archive/2018/05)
- ▼ ▶
[2017](https://kazuki-nagasawa.hatenablog.com/archive/2017)
- [2017 / 5](https://kazuki-nagasawa.hatenablog.com/archive/2017/05)
- ▼ ▶
[2016](https://kazuki-nagasawa.hatenablog.com/archive/2016)
- [2016 / 8](https://kazuki-nagasawa.hatenablog.com/archive/2016/08)
- ▼ ▶
[2015](https://kazuki-nagasawa.hatenablog.com/archive/2015)
- [2015 / 12](https://kazuki-nagasawa.hatenablog.com/archive/2015/12)
- [2015 / 6](https://kazuki-nagasawa.hatenablog.com/archive/2015/06)
- [2015 / 5](https://kazuki-nagasawa.hatenablog.com/archive/2015/05)
- [2015 / 4](https://kazuki-nagasawa.hatenablog.com/archive/2015/04)
- [2015 / 3](https://kazuki-nagasawa.hatenablog.com/archive/2015/03)
- [2015 / 2](https://kazuki-nagasawa.hatenablog.com/archive/2015/02)
- ▼ ▶
[2014](https://kazuki-nagasawa.hatenablog.com/archive/2014)
- [2014 / 12](https://kazuki-nagasawa.hatenablog.com/archive/2014/12)
- [2014 / 11](https://kazuki-nagasawa.hatenablog.com/archive/2014/11)
- [2014 / 9](https://kazuki-nagasawa.hatenablog.com/archive/2014/09)
- [2014 / 8](https://kazuki-nagasawa.hatenablog.com/archive/2014/08)
- [2014 / 7](https://kazuki-nagasawa.hatenablog.com/archive/2014/07)
- [2014 / 6](https://kazuki-nagasawa.hatenablog.com/archive/2014/06)
- [2014 / 3](https://kazuki-nagasawa.hatenablog.com/archive/2014/03)
- [2014 / 2](https://kazuki-nagasawa.hatenablog.com/archive/2014/02)
- [2014 / 1](https://kazuki-nagasawa.hatenablog.com/archive/2014/01)
- ▼ ▶
[2013](https://kazuki-nagasawa.hatenablog.com/archive/2013)
- [2013 / 12](https://kazuki-nagasawa.hatenablog.com/archive/2013/12)
カテゴリー
- [Canvas (6)](https://kazuki-nagasawa.hatenablog.com/archive/category/Canvas)
- [javascript (14)](https://kazuki-nagasawa.hatenablog.com/archive/category/javascript)
- [Boids (1)](https://kazuki-nagasawa.hatenablog.com/archive/category/Boids)
- [PC組み立て (1)](https://kazuki-nagasawa.hatenablog.com/archive/category/PC%E7%B5%84%E3%81%BF%E7%AB%8B%E3%81%A6)
- [NumPy (5)](https://kazuki-nagasawa.hatenablog.com/archive/category/NumPy)
- [SciPy (2)](https://kazuki-nagasawa.hatenablog.com/archive/category/SciPy)
- [Python (27)](https://kazuki-nagasawa.hatenablog.com/archive/category/Python)
- [AvaloniaUI (1)](https://kazuki-nagasawa.hatenablog.com/archive/category/AvaloniaUI)
- [Mono (1)](https://kazuki-nagasawa.hatenablog.com/archive/category/Mono)
- [C++ (7)](https://kazuki-nagasawa.hatenablog.com/archive/category/C%2B%2B)
- [C\# (1)](https://kazuki-nagasawa.hatenablog.com/archive/category/C%23)
- [OpenCV (2)](https://kazuki-nagasawa.hatenablog.com/archive/category/OpenCV)
- [Seaborn (1)](https://kazuki-nagasawa.hatenablog.com/archive/category/Seaborn)
- [Matplotlib (2)](https://kazuki-nagasawa.hatenablog.com/archive/category/Matplotlib)
- [ProcedualMeshComponent (1)](https://kazuki-nagasawa.hatenablog.com/archive/category/ProcedualMeshComponent)
- [Mesh (1)](https://kazuki-nagasawa.hatenablog.com/archive/category/Mesh)
- [UE4 (1)](https://kazuki-nagasawa.hatenablog.com/archive/category/UE4)
- [Boost (4)](https://kazuki-nagasawa.hatenablog.com/archive/category/Boost)
- [Life game (1)](https://kazuki-nagasawa.hatenablog.com/archive/category/Life%20game)
- [Cython (2)](https://kazuki-nagasawa.hatenablog.com/archive/category/Cython)
- [Threading (2)](https://kazuki-nagasawa.hatenablog.com/archive/category/Threading)
- [Linux (19)](https://kazuki-nagasawa.hatenablog.com/archive/category/Linux)
- [any (1)](https://kazuki-nagasawa.hatenablog.com/archive/category/any)
- [docopt (1)](https://kazuki-nagasawa.hatenablog.com/archive/category/docopt)
- [collections (1)](https://kazuki-nagasawa.hatenablog.com/archive/category/collections)
- [all (1)](https://kazuki-nagasawa.hatenablog.com/archive/category/all)
- [Multi process (1)](https://kazuki-nagasawa.hatenablog.com/archive/category/Multi%20process)
- [マルチプロセス (1)](https://kazuki-nagasawa.hatenablog.com/archive/category/%E3%83%9E%E3%83%AB%E3%83%81%E3%83%97%E3%83%AD%E3%82%BB%E3%82%B9)
- [ConfigParser (1)](https://kazuki-nagasawa.hatenablog.com/archive/category/ConfigParser)
- [Chrome (1)](https://kazuki-nagasawa.hatenablog.com/archive/category/Chrome)
- [Color Picker (1)](https://kazuki-nagasawa.hatenablog.com/archive/category/Color%20Picker)
- [画像処理 (4)](https://kazuki-nagasawa.hatenablog.com/archive/category/%E7%94%BB%E5%83%8F%E5%87%A6%E7%90%86)
- [並列処理 (1)](https://kazuki-nagasawa.hatenablog.com/archive/category/%E4%B8%A6%E5%88%97%E5%87%A6%E7%90%86)
- [D3.js (3)](https://kazuki-nagasawa.hatenablog.com/archive/category/D3.js)
- [メール (1)](https://kazuki-nagasawa.hatenablog.com/archive/category/%E3%83%A1%E3%83%BC%E3%83%AB)
- [Windows (2)](https://kazuki-nagasawa.hatenablog.com/archive/category/Windows)
- [Ubuntu (1)](https://kazuki-nagasawa.hatenablog.com/archive/category/Ubuntu)
- [入れ替え (1)](https://kazuki-nagasawa.hatenablog.com/archive/category/%E5%85%A5%E3%82%8C%E6%9B%BF%E3%81%88)
- [データ解析 (1)](https://kazuki-nagasawa.hatenablog.com/archive/category/%E3%83%87%E3%83%BC%E3%82%BF%E8%A7%A3%E6%9E%90)
- [行列 (1)](https://kazuki-nagasawa.hatenablog.com/archive/category/%E8%A1%8C%E5%88%97)
- [SQL (1)](https://kazuki-nagasawa.hatenablog.com/archive/category/SQL)
- [PostgreSQL (2)](https://kazuki-nagasawa.hatenablog.com/archive/category/PostgreSQL)
- [Fortran (2)](https://kazuki-nagasawa.hatenablog.com/archive/category/Fortran)
- [C (5)](https://kazuki-nagasawa.hatenablog.com/archive/category/C)
- [CentOS (3)](https://kazuki-nagasawa.hatenablog.com/archive/category/CentOS)
- [数値計算 (2)](https://kazuki-nagasawa.hatenablog.com/archive/category/%E6%95%B0%E5%80%A4%E8%A8%88%E7%AE%97)
- [Theano (1)](https://kazuki-nagasawa.hatenablog.com/archive/category/Theano)
- [Deep Learning (1)](https://kazuki-nagasawa.hatenablog.com/archive/category/Deep%20Learning)
- [連携 (1)](https://kazuki-nagasawa.hatenablog.com/archive/category/%E9%80%A3%E6%90%BA)
- [gcc (1)](https://kazuki-nagasawa.hatenablog.com/archive/category/gcc)
- [gfortran (1)](https://kazuki-nagasawa.hatenablog.com/archive/category/gfortran)
- [Nominatim (1)](https://kazuki-nagasawa.hatenablog.com/archive/category/Nominatim)
- [php (1)](https://kazuki-nagasawa.hatenablog.com/archive/category/php)
- [OpenStreetMap (1)](https://kazuki-nagasawa.hatenablog.com/archive/category/OpenStreetMap)
- [geocoding (1)](https://kazuki-nagasawa.hatenablog.com/archive/category/geocoding)
- [RTree (1)](https://kazuki-nagasawa.hatenablog.com/archive/category/RTree)
- [flickr (1)](https://kazuki-nagasawa.hatenablog.com/archive/category/flickr)
- [画像 (1)](https://kazuki-nagasawa.hatenablog.com/archive/category/%E7%94%BB%E5%83%8F)
- [API (1)](https://kazuki-nagasawa.hatenablog.com/archive/category/API)
- [createjs (1)](https://kazuki-nagasawa.hatenablog.com/archive/category/createjs)
- [RGB (1)](https://kazuki-nagasawa.hatenablog.com/archive/category/RGB)
- [HSV (1)](https://kazuki-nagasawa.hatenablog.com/archive/category/HSV)
- [icc (1)](https://kazuki-nagasawa.hatenablog.com/archive/category/icc)
- [mkl (1)](https://kazuki-nagasawa.hatenablog.com/archive/category/mkl)
- [CouchDB (1)](https://kazuki-nagasawa.hatenablog.com/archive/category/CouchDB)
- [bootstrap (1)](https://kazuki-nagasawa.hatenablog.com/archive/category/bootstrap)
- [jquery (2)](https://kazuki-nagasawa.hatenablog.com/archive/category/jquery)
- [django (2)](https://kazuki-nagasawa.hatenablog.com/archive/category/django)
- [httpd (1)](https://kazuki-nagasawa.hatenablog.com/archive/category/httpd)
- [apache (1)](https://kazuki-nagasawa.hatenablog.com/archive/category/apache)
- [GridFS (1)](https://kazuki-nagasawa.hatenablog.com/archive/category/GridFS)
- [pymongo (2)](https://kazuki-nagasawa.hatenablog.com/archive/category/pymongo)
- [mongodb (2)](https://kazuki-nagasawa.hatenablog.com/archive/category/mongodb)
- [ImageMagick (3)](https://kazuki-nagasawa.hatenablog.com/archive/category/ImageMagick)
- [Wand (3)](https://kazuki-nagasawa.hatenablog.com/archive/category/Wand)
- [Image processing (3)](https://kazuki-nagasawa.hatenablog.com/archive/category/Image%20processing)
- [Image (3)](https://kazuki-nagasawa.hatenablog.com/archive/category/Image)
Twitter
[@kazuki\_nagasawa からのツイート](https://twitter.com/kazuki_nagasawa)
[]()
引用をストックしました
ストック一覧を見る
閉じる
引用するにはまずログインしてください
ログイン
閉じる
引用をストックできませんでした。再度お試しください
閉じる
限定公開記事のため引用できません。
[読者です 読者をやめる 読者になる 読者になる](https://kazuki-nagasawa.hatenablog.com/entry/memo_20151205_python_multiprocess_signal) |
| Readable Markdown | null |
| Shard | 43 (laksa) |
| Root Hash | 14147412586147868043 |
| Unparsed URL | com,hatenablog!kazuki-nagasawa,/entry/memo_20151205_python_multiprocess_signal s443 |