Pythonのマルチスレッドとマルチプロセスモジュールの比較テスト


本稿では,主にPythonのマルチスレッドとマルチプロセスモジュールのCPUタイプとI/Oのタスク操作をテストする際の効率を比較する.
CPU消耗タイプをテストするタスク
マルチコアCPU 1台のサーバ上でマルチスレッドコードを実行し、理論的にはコード実行時に余分なCPUコアを利用して性能を向上させる.しかしPythonのGILが存在するため,マルチスレッドを用いてCPUの煩雑なタスクを実行することで,必ずしも性能向上が得られるとは限らない.しかしGILは、Pythonインタプリタでスレッドを実行するのは安全ではないため、つまりPythonスレッドの実行時の安全を保証するために、Pythonはグローバルロックを提供し、同じ時点で、1つのスレッドだけがこのフルロックを取得して実行することを許可する.
CPU消耗タイプタスク
def f(n):
    list=[]
    for x in range(n):
        x=x*x
        list.append(x)

1.単一スレッドテスト
#!/usr/sbin/python
import threading

def f(n):
    list=[]
    for x in range(n):
        x=x*x
        list.append(x)

if __name__ == '__main__':
   threads=2
   tasks=[]
   for i in range(1,threads):
      thread=threading.Thread(target=f(10000000))
      tasks.append(thread)
   for j in tasks:
      j.start()
   for j in tasks:
      j.join()
real	0m4.965s
user	0m4.104s
sys	0m0.797s

単一スレッドを使用した実行時間は約4.9秒
2.2スレッド使用
threads=3の設定
real	0m8.469s
user	0m7.480s
sys	0m0.981s

2つのスレッドを使用して以上のタスクを実行すると、パフォーマンスが大幅に低下します.
3.4スレッド使用
threads=5の設定
real	0m16.016s
user	0m14.712s
sys	0m1.285s

4.8スレッド使用
threads=9の設定
real	0m31.374s
user	0m29.231s
sys	0m2.108s

以上のテストから,Pythonのマルチスレッドモジュールを用いると,スレッド数が多いほどCPU消費型のタスクを実行する際に効率が低下することが分かる.
5.単一プロセステスト
参照ドキュメント:
https://www.quantstart.com/articles/parallelising-python-with-threading-and-multiprocessing