Python
Python3

Python3での並行・並列処理の選択肢(2018/03)

概要

2018年3月現在において、Python 3系の標準ライブラリを使い、並列・並行処理を実装する際の選択肢についてまとめる。

それぞれのモジュールの使い方や実装例については、この記事では紹介しない。

並行処理

threading

スレッドを使い、並行処理を実現する。threadingを使った実装は比較的容易だが(asyncioと比べると)、メモリ使用量などリソース面でのコストが大きい。

詳しくは『Effective Python』の「項目40;多くの関数を平行に実行するにはコルーチンを考える」を参照。

https://docs.python.jp/3/library/threading.html

asyncio

Python3.4で追加されたモジュール。Python3での並行処理の標準と言っていいはず。

公式ドキュメントの見出しは、「非同期 I/O、イベントループ、コルーチンおよびタスク」となっている。

多機能で使いこなすのが難しい印象。

https://docs.python.jp/3/library/asyncio.html

(参考)gevent

Python2環境では、イベント駆動の実装によく使われていた。Python3の対応に時間がかかっている印象だったが、今は対応済みのようだ。

http://www.gevent.org/index.html

今後はasyncioのほうが一般的になっていくと思われる。

並列処理

multiprocessing

APIはthreadingモジュールとよく似ている。こちらはスレッドではなくサブプロセスを使うことで、並列処理を可能にする。

https://docs.python.jp/3/library/multiprocessing.html

subprocess

Pythonから他のプログラムを実行することで、並列処理を可能にする。
並列処理のためよりも、シェルコマンドの実行などで使うケースのほうが一般的かもしれない。

>>> import subprocess
>>> ret = subprocess.getoutput('date')
>>> ret
'2018年  3月 24日 土曜日 12:43:29 JST'

https://docs.python.jp/3/library/subprocess.html

参考文献