【Python】Python ~ 並行 / 並列処理 ~

■ はじめに

Python の 並行 / 並列処理(※)について、学ぶ。

※ 並列処理 について
別のCPUコアの
別のpythonプロセスで
複数の処理を同時に行う

Python での並列処理

https://docs.python.org/ja/3/library/concurrency.html

より抜粋
~~~~
【1】multiprocessing
【2】concurrent.futures
など
~~~~

標準ライブラリ以外にも色々あるみたい

【1】multiprocessing

* Python2系列では2.6以降,3系列では3.0以降
* 標準ライブラリ

公式サイト
https://docs.python.org/ja/3/library/multiprocessing.html

使用上の注意

1)メインモジュールが必要

* 「if __name__ == "__main__":」が必要

2)メモリ消費が激しい

* 基本的に必要なデータがすべてコピーされるので、
 メモリ消費を気を付ける

https://www.haya-programming.com/entry/2017/02/09/190512#multiprocessing%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%81%84%E3%82%8B%E3%81%AA%E3%82%89%E4%BD%BF%E3%81%86%E3%81%AE%E3%82%92%E3%82%84%E3%82%81%E3%82%8B%E3%81%82%E3%82%8B%E3%81%84%E3%81%AF%E3%83%97%E3%83%AD%E3%82%BB%E3%82%B9%E6%95%B0%E3%82%92%E6%B8%9B%E3%82%89%E3%81%99
https://www.haya-programming.com/entry/2018/12/28/203555

サンプル

例1:Hello world

from multiprocessing import Pool

def func(x):
  return x*x

if __name__ == '__main__':
  with Pool(processes=3) as pool:
    print(pool.map(func, [1, 2, 3])) # 出力結果 [1, 4, 9]

【2】concurrent.futures

* From Python3.2

公式サイト
https://docs.python.org/ja/3/library/concurrent.futures.html

サンプル

例1

from concurrent.futures.process import ProcessPoolExecutor
import time

def task(index):
  time.sleep(1.0)
  print("{}".format(index))

if __name__ == "__main__":
  with ProcessPoolExecutor() as executor:
    for i in range(3):
      executor.submit(task, i) # ランダムで「0」「1」「2」が出力
  print("Done")

例2:future

from concurrent.futures import ThreadPoolExecutor

def task(value1, value2):
  return "{}, {}!".format(value1, value2)

futures = []
with ThreadPoolExecutor(3) as executor:
  for i in range(3):
    future = executor.submit(task, "Hello", i)
    futures.append(future)

for future in futures:
  print(future.result()) # 「Hello, 0!」「Hello, 1!」「Hello, 2!」

参考文献

【1】multiprocessing
https://qiita.com/studio_haneya/items/1cf192a0185e12c7559b
https://qiita.com/yukiB/items/203a6248c2d466b80d38
https://minus9d.hatenablog.com/entry/2017/10/26/231241
https://www.yoheim.net/blog.php?q=20170601
https://gihyo.jp/dev/serial/01/pythonhacks/0005
【2】concurrent.futures
https://dev.classmethod.jp/articles/error-python-process-pool-executor/
https://qiita.com/tag1216/items/db5adcf1ddcb67cfefc8
https://qiita.com/kokumura/items/2e3afc1034d5aa7c6012
https://qiita.com/y518gaku/items/7a59be2b67e92f1ac30e