🕷️ Crawler Inspector

URL Lookup

Direct Parameter Lookup

Raw Queries and Responses

1. Shard Calculation

Query:
Response:
Calculated Shard: 43 (from laksa089)

2. Crawled Status Check

Query:
Response:

3. Robots.txt Check

Query:
Response:

4. Spam/Ban Check

Query:
Response:

5. Seen Status Check

ℹ️ Skipped - page is already crawled

🚫
NOT INDEXABLE
CRAWLED
7 months ago
🤖
ROBOTS ALLOWED

Page Info Filters

FilterStatusConditionDetails
HTTP statusPASSdownload_http_code = 200HTTP 200
Age cutoffFAILdownload_stamp > now() - 6 MONTH7.8 months ago
History dropPASSisNull(history_drop_reason)No drop reason
Spam/banPASSfh_dont_index != 1 AND ml_spam_score = 0ml_spam_score=0
CanonicalPASSmeta_canonical IS NULL OR = '' OR = src_unparsedNot set

Page Details

PropertyValue
URLhttps://kazuki-nagasawa.hatenablog.com/entry/memo_20151205_python_multiprocess_signal
Last Crawled2025-08-15 03:06:43 (7 months ago)
First Indexednot set
HTTP Status Code200
Meta TitlePython で Multi process (して、更に Signal で安全に終了させる) - 雑食性雑感雑記
Meta DescriptionPython のマルチプロセス実装を試してみました。 合わせて、Signal で安全にプロセスを落とせるようにしてみました。
Meta Canonicalnull
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.st-hatena.com/images/entry-button/button-only.gif)](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) プロフィール [![id:kazuki\_nagasawa](https://cdn.profile-image.st-hatena.com/users/kazuki_nagasawa/profile.png?1386255767)](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://cdn.blog.st-hatena.com/images/admin/quote/quote-x-icon.svg?version=659be1d3269011c012da7579d18f50)]() 引用をストックしました ストック一覧を見る 閉じる 引用するにはまずログインしてください ログイン 閉じる 引用をストックできませんでした。再度お試しください 閉じる 限定公開記事のため引用できません。 [読者です 読者をやめる 読者になる 読者になる](https://kazuki-nagasawa.hatenablog.com/entry/memo_20151205_python_multiprocess_signal)
Readable Markdownnull
Shard43 (laksa)
Root Hash14147412586147868043
Unparsed URLcom,hatenablog!kazuki-nagasawa,/entry/memo_20151205_python_multiprocess_signal s443