Librabuch
Facebook
Twitter
Google+
LinkedIn
Instagram
GitHub
RSS
✕
  • Home
  • Profile

ごく簡単なPython multiprocessingの使い方

2015-01-23takahiro_ikeuchi
このエントリーをはてなブックマークに追加

ごく簡単なPython multiprocessingの使い方の話。

multiprocessing before/after

例えば次のようなコードがあります。

multiprocessing before
Python
1
2
3
4
5
6
7
8
9
10
11
12
import time
 
 
def calc(x):
    a = x * 2
    print(a)
    time.sleep(2)
 
if __name__ == '__main__':
    data = [1, 2, 3, 4, 5]
 
    [calc(x) for x in data]

この処理を、後から並列で実行したくなったとします。(そのような経験があなたにもありますよね?)

multiprocessing after
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
import time
import multiprocessing
 
 
def worker(data):
    [calc(x) for x in data]
 
 
def calc(x):
    a = x * 2
    print(a)
    time.sleep(2)
 
if __name__ == '__main__':
    split_data = [[1, 2, 3], [4, 5]]
 
    jobs = []
    for data in split_data:
        job = multiprocessing.Process(target=worker, args=(data, ))
        jobs.append(job)
        job.start()
 
    [job.join() for job in jobs]
 
    print('Finish')

このコードは、子プロセスを2つ生成して処理を実行します。

処理対象のリスト = data を2分割したものが split_data です。分割はCPUのコア数などに応じて動的に行われるべきですが、本題ではないので手動で分割しています。for文の中身はごく簡単なmultiprocessingの使い方です。targetで指定しているworker()はWrapper的な役割を持たせたメソッドで、新規に追加したものです。

worker()経由で実行するとcalc()に変更を加えなくて良いため、お手軽感があります。

multiprocessingの間違いあるある

join()を省略するとどうなるでしょうか。

join()しない
Python
1
2
3
4
5
6
for data in split_data:
    job = multiprocessing.Process(target=worker, args=(data, ))
    jobs.append(job)
    job.start()
 
print('Finish')

並列処理が完了する前にprint()が実行されてしまい、後続の処理がある場合問題になります。

joinの位置を以下のようにするとどうなるでしょうか。

join()の位置がおかしい
Python
1
2
3
4
5
6
for data in split_data:
    job = multiprocessing.Process(target=worker, args=(data, ))
    job.start()
    job.join()
 
print('Finish')

start()したプロセスの完了をforの中で待つことになるので、シングルプロセスでの実行と同じになってしまいます。

まとめ

  • multiprocessingで直列に行っていた繰り返し処理を簡単に並列化できます
  • join()は適切に行いましょう
このエントリーをはてなブックマークに追加
Python, multiprocessing
Python ライブラリ厳選レシピ
Pythonエンジニア養成読本[いまどきの開発ノウハウ満載!]

Recent Entries

  • 十二月だけど恩田陸『三月は深き紅の淵を』について語るよ 2015-12-29
  • 日本語 Web フォントなら Adobe Typekit がいい話 2015-10-16
  • PyCon JP 2015 振り返り コミュニティのライフサイクルについて 2015-10-14
  • HashiCorp Otto で MySQL 5.7 の環境をつくる 2015-10-06
  • 『Pythonライブラリ厳選レシピ』を執筆しました 2015-10-01

Tag Cloud

AWS Book CentOS CSS DWH ElastiCache fluentd HTML IDE IntelliJ IoT IPython JAVA JetBrains JSON KVS LAMP Linux LNMP MariaDB Microsoft MySQL nginx NoSQL NumPy Pandas PIL Pillow PostgreSQL Pycharm PyCon PyCon APAC PyCon JP Pyramid Python Redis Redshift Ruby S3 Scrum Shell Sphinx SQLAlchemy SSD Wordpress

Social Links

Facebook
Twitter
Google+
LinkedIn
Instagram
GitHub
RSS
© 2013-2015 Librabuch.
ZEPHYR theme by UpSolution