💡

Pythonのthreadを復習してみた。[個人的メモ]

2023/09/20に公開

Pythonはシングルスレッドだ。

例えば実行に1秒かかる関数taskがあるとする。

def task():
  print('Starting a task...')
  sleep(1)
  print('done')

以下のように2回taskを呼べば、pythonはシングルスレッドのため、1回目のtaskの終了を待ってから2回目のtaskを開始するため、全体では2秒かかる。

task()
task()

これを解決するのがThreadだ。処理を並行して走らせることで1秒で処理を終わらせることが出来る。

pythonでthreadを使用するにはまずThreadをインポートする。

from threading import Thread

次に、Threadインスタンスを初期化し、threadを作る。

new_thread = Thread(target=fn,args=args_tuple)

Thread()が取る引数は、
target = メインスレッド以外で実行したい関数
args = 引数。 argはtupleなので注意。

次にstartを呼び、threadを開始する。

new_thread.start()

もし、メインスレッドで、スレッドの終了を待ちたいなら、join()を呼ぶ。

new_thread.join()

これまでの知識を使用して、サンプルコードを書く。

from time import sleep, perf_counter
from threading import Thread


def task(id):
    print(f'Starting the task {id}...')
    sleep(1)
    print(f'The task {id} completed')


start_time = perf_counter()

# create and start 10 threads
threads = []
for n in range(1, 11):
    t = Thread(target=task, args=(n,))
    threads.append(t)
    t.start()

# wait for the threads to complete
for t in threads:
    t.join()

end_time = perf_counter()

print(f'It took {end_time- start_time: 0.2f} second(s) to complete.')

サンプルコードを実行すると It took 1.01 second(s) to complete. と表示された。並列処理が出来ていることがわかる。

以上。個人的pythonの復習でした。

参考
https://www.pythontutorial.net/python-concurrency/python-threading/

Discussion