Python のマルチプロセッシング モジュールを使用すると、プロセスを作成および管理できるため、マシン上の複数のプロセッサを最大限に活用できます。スレッドが同じメモリ空間を共有するスレッドとは異なり、プロセスごとに個別のメモリ空間を使用することで並列実行を実現できます。以下は、マルチプロセッシング モジュールで一般的に使用されるクラスとメソッドのリストと簡単な例です。
Process クラスはマルチプロセッシング モジュールのコアであり、新しいプロセスを作成して実行できます。
from multiprocessing import Process def print_numbers(): for i in range(5): print(i) p = Process(target=print_numbers) p.start() # Starts a new process p.join() # Waits for the process to finish
プロセスのアクティビティを開始します。
p = Process(target=print_numbers) p.start() # Runs the target function in a separate process
join() メソッドが呼び出されるプロセスが終了するまで、呼び出しプロセスをブロックします。オプションで、タイムアウトを指定できます。
p = Process(target=print_numbers) p.start() p.join(2) # Waits up to 2 seconds for the process to finish
プロセスがまだ実行中の場合は True を返します。
p = Process(target=print_numbers) p.start() print(p.is_alive()) # True if the process is still running
呼び出しプロセスを表す現在の Process オブジェクトを返します。
from multiprocessing import current_process def print_current_process(): print(current_process()) p = Process(target=print_current_process) p.start() # Prints the current process info
現在有効なすべてのプロセス オブジェクトのリストを返します。
p1 = Process(target=print_numbers) p2 = Process(target=print_numbers) p1.start() p2.start() print(Process.active_children()) # Lists all active child processes
マシンで使用可能な CPU の数を返します。
from multiprocessing import cpu_count print(cpu_count()) # Returns the number of CPUs on the machine
Pool オブジェクトは、複数の入力値にわたる関数の実行を並列化する便利な方法を提供します。ワーカープロセスのプールを管理します。
from multiprocessing import Pool def square(n): return n * n with Pool(4) as pool: # Pool with 4 worker processes result = pool.map(square, [1, 2, 3, 4, 5]) print(result) # [1, 4, 9, 16, 25]
キューは、複数のプロセス間でデータを受け渡して通信できるようにする共有データ構造です。
from multiprocessing import Process, Queue def put_data(q): q.put([1, 2, 3]) def get_data(q): data = q.get() print(data) q = Queue() p1 = Process(target=put_data, args=(q,)) p2 = Process(target=get_data, args=(q,)) p1.start() p2.start() p1.join() p2.join()
ロックにより、一度に 1 つのプロセスだけが共有リソースにアクセスできるようになります。
from multiprocessing import Process, Lock lock = Lock() def print_numbers(): with lock: for i in range(5): print(i) p1 = Process(target=print_numbers) p2 = Process(target=print_numbers) p1.start() p2.start() p1.join() p2.join()
Value オブジェクトと Array オブジェクトを使用すると、プロセス間で単純なデータ型と配列を共有できます。
from multiprocessing import Process, Value def increment(val): with val.get_lock(): val.value += 1 shared_val = Value('i', 0) processes = [Process(target=increment, args=(shared_val,)) for _ in range(10)] for p in processes: p.start() for p in processes: p.join() print(shared_val.value) # Output will be 10
パイプは、2 つのプロセス間の双方向通信チャネルを提供します。
from multiprocessing import Process, Pipe def send_message(conn): conn.send("Hello from child") conn.close() parent_conn, child_conn = Pipe() p = Process(target=send_message, args=(child_conn,)) p.start() print(parent_conn.recv()) # Receives data from the child process p.join()
マネージャーを使用すると、複数のプロセスが同時に変更できるリストや辞書などの共有オブジェクトを作成できます。
from multiprocessing import Process, Manager def modify_list(shared_list): shared_list.append("New item") with Manager() as manager: shared_list = manager.list([1, 2, 3]) p = Process(target=modify_list, args=(shared_list,)) p.start() p.join() print(shared_list) # [1, 2, 3, "New item"]
セマフォを使用すると、リソースへのアクセスを制御し、一度に特定の数のプロセスのみにアクセスを許可できます。
from multiprocessing import Process, Semaphore import time sem = Semaphore(2) # Only 2 processes can access the resource def limited_access(): with sem: print("Accessing resource") time.sleep(2) processes = [Process(target=limited_access) for _ in range(5)] for p in processes: p.start() for p in processes: p.join()
Python のマルチプロセッシング モジュールは、マシン上の複数のプロセッサを最大限に活用するように設計されています。 Process を使用したプロセスの作成と管理から、Lock と Semaphore を使用した共有リソースの制御、Queue と Pipe を介した通信の促進に至るまで、マルチプロセッシング モジュールは、Python アプリケーションでタスクを並列化するために不可欠です。
以上が例を含む Python マルチプロセッシング モジュールのクイック ガイドの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。