multiprocessingの基礎
複数のCPUコアを使用します
「multiprocessingの基礎」はCoddyKit上の無料Python Academyレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはPython Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Python Academyコースには全4レッスンが含まれています。
なぜmultiprocessingを使うのか
GILにより、スレッドはPythonのバイトコードを並列に実行できません。multiprocessingモジュールは、独自のインタープリターとGILを持つ別々のプロセスを起動することで、この制約を回避します。そのため、CPUバウンドな処理を複数のコアで実際に実行できます。
import multiprocessing as mp
print('CPU cores available:', mp.cpu_count())プロセスの開始
Process(target=func)はthreading APIと同様の使い方をします。start()で起動し、join()で完了を待ちます。
import multiprocessing as mp
def worker():
print('hello from a child process')
if __name__ == '__main__':
p = mp.Process(target=worker)
p.start()
p.join()
print('parent done')__main__ガード
一部のプラットフォームでは、子プロセスがスクリプトをインポートします。if __name__ == '__main__':ガードがないと、プロセスが再帰的に生成される可能性があります。起動コードは必ずこの中に記述してください。
import multiprocessing as mp
def task(n):
print('processing', n)
if __name__ == '__main__':
for i in range(3):
p = mp.Process(target=task, args=(i,))
p.start()
p.join()引数の渡し方
スレッドの場合と同様に、位置引数にはargsを、キーワード引数にはkwargsを使用します。引数はpickle化されて子プロセスに送られます。
import multiprocessing as mp
def show(label, times):
for _ in range(times):
print(label)
if __name__ == '__main__':
p = mp.Process(target=show, args=('hi',), kwargs={'times': 2})
p.start()
p.join()ワーカーのプール
multiprocessing.Poolはプロセスのグループを管理します。pool.mapはイテラブルをプロセス間で分割し、結果を順番に収集します。
import multiprocessing as mp
def square(n):
return n * n
if __name__ == '__main__':
with mp.Pool(processes=2) as pool:
print(pool.map(square, range(6)))ProcessPoolExecutor
concurrent.futures APIにはProcessPoolExecutorも用意されており、スレッドで学んだものと同じsubmit/mapインターフェースを使用できます。
from concurrent.futures import ProcessPoolExecutor
def cube(n):
return n ** 3
if __name__ == '__main__':
with ProcessPoolExecutor() as ex:
print(list(ex.map(cube, range(5))))分離されたメモリ空間
各プロセスは独自のメモリを持ちます。子プロセスでグローバル変数を変更しても、親プロセスのコピーは変更されません。データは明示的に返すか、共有する必要があります。
import multiprocessing as mp
counter = 0
def bump():
global counter
counter += 100
if __name__ == '__main__':
p = mp.Process(target=bump)
p.start()
p.join()
print('parent counter still:', counter)結果の受け取り方
メモリは共有されないため、グローバル変数を変更するのではなく、Pool.map、executor、またはキューを通じて結果を返します。
import multiprocessing as mp
def double(n):
return n * 2
if __name__ == '__main__':
with mp.Pool(2) as pool:
results = pool.map(double, [1, 2, 3, 4])
print('results:', results)単一呼び出し向けのapply_async
apply_asyncは1つの呼び出しをスケジュールし、結果ハンドルを返します。値を取得するには.get()を呼び出します。
import multiprocessing as mp
def add(a, b):
return a + b
if __name__ == '__main__':
with mp.Pool(2) as pool:
r = pool.apply_async(add, (3, 4))
print(r.get())Pickle化の要件
プロセス境界を越えて渡せるように、ターゲットと引数はpickle化可能でなければなりません。トップレベルの関数は動作しますが、ラムダやローカル関数は通常動作しません。
import multiprocessing as mp
def top_level(n):
return n + 1
if __name__ == '__main__':
with mp.Pool(2) as pool:
print(pool.map(top_level, [10, 20]))プロセスを使う場面
数学計算、画像処理、解析などのCPUバウンドな処理にはプロセスを使用します。プロセスの起動とpickle化にはオーバーヘッドがあるため、多数の小さなタスクよりも、少数の負荷の大きいタスクに適しています。
import multiprocessing as mp
def heavy(n):
return sum(i * i for i in range(n))
if __name__ == '__main__':
with mp.Pool() as pool:
print(pool.map(heavy, [1000, 2000, 3000]))確認問題
multiprocessingの理解度を確認しましょう。
復習
multiprocessingの基本について学びました。
- プロセスはGILを回避し、実際のCPU並列処理を実現します。
if __name__ == '__main__'ガードを使用します。PoolとProcessPoolExecutorは処理を分散し、結果を収集します。- メモリは共有されないため、引数はpickle化可能でなければなりません。
次は、キューとロックを使った安全なデータ共有です。
よくある質問
「multiprocessingの基礎」レッスンは無料ですか?
はい。「multiprocessingの基礎」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Python Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Python Academyコースには全4レッスンが含まれています。
「multiprocessingの基礎」で何を学びますか?
複数のCPUコアを使用します ブラウザで直接実行するハンズオンコードでPython Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Python Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのPython Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。
「multiprocessingの基礎」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このPython Academyレッスンでコードを書いて実行できますか?
はい。すべてのPython Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- スレッドとGIL
- ThreadPoolExecutor
- multiprocessingの基礎
- データの安全な共有