lisz-works

技術と興味の集合体

Python3でマルチスレッド処理をする簡単なサンプル

【スポンサーリンク】

Python

Python3でプロセスを立ち上げて、マルチスレッドで処理する方法です!

import

importするのはコチラ。

from multiprocessing import Process

プロセス作成

このようにするとプロセスを作成することができます。

p1 = Process(target=print, args=(1, 2, 3), kwargs={'sep': '-'})

Processの引数は

項目 用途
target プロセスにする関数
args 引数
kwargs 引数

第1引数 argsの注意点

引数(少なくともargs)は、引数が1つの場合は注意が必要そう。

あくまでタプルで渡すようにできているため

def func(arg):
    print(str(arg))

p = Process(target=func, args=(1))

のようにするとエラーになる。

この場合、下記のようにカンマをつけ、タプル扱いにする必要がある。

def func(arg):
    print(str(arg))

p = Process(target=func, args=(1,))

プロセスを操作する関数

作成したプロセスは、これらを実行する事ができます。

関数 内容
p1.start() プロセスの開始
p1.terminate() プロセスの中断
p1.join() 処理のブロック

見ている限りjoin()をすると動き出すのですが、「処理のブロック」というのがよくわからない……

サンプル

サンプルソースと実行結果についてです。

ソース

サンプルソースです。

from multiprocessing import Process
import time

def runProcess(num, t):
    f = t * 0.1
    for i in range(5):
        time.sleep(f)
        print('im process' + str(num) + " : " + str(i))

if __name__ == '__main__':
    print('*** create instanse')
    process1 = Process(target=runProcess, args=(1, 5))
    process2 = Process(target=runProcess, args=(2, 7))
    process3 = Process(target=runProcess, args=(3, 9))
    print('*** start process')
    process1.start()
    process2.start()
    process3.start()
    print('*** proces join')
    process1.join()
    process2.join()
    process3.join()
    print("process ended")

runProcess()を作成し、同じ関数で3プロセス生成して実行しています。

それぞれ

  1. 0.5 ms周期
  2. 0.7 ms周期
  3. 0.9 ms周期

で動作します。

結果

サンプルの実行結果です。

*** create instanse
*** start process
*** proces join
im process1 : 0
im process2 : 0
im process3 : 0
im process1 : 1
im process2 : 1
im process1 : 2
im process3 : 1
im process1 : 3
im process2 : 2
im process1 : 4
im process3 : 2
im process2 : 3
im process2 : 4
im process3 : 3
im process3 : 4
process ended

各プロセスが並行して実行されていることがわかります。

第2引数の時間を変更すれば、タイミングが変わるので出力も変化します。

参考

コチラを参考にしました。ありがとうございました。

note.crohaco.net

docs.python.org

あとがき

Python3でマルチスレッド処理をする簡単なサンプルでした!

引数が微妙にクセありなものの、簡単にマルチスレッド化することができました。

是非試してみてください!