ホームページ  >  記事  >  バックエンド開発  >  例を含む Python マルチプロセッシング モジュールのクイック ガイド

例を含む Python マルチプロセッシング モジュールのクイック ガイド

WBOY
WBOYオリジナル
2024-09-12 14:17:10754ブラウズ

A Quick Guide to the Python multiprocessing Module with Examples

導入

Python のマルチプロセッシング モジュールを使用すると、プロセスを作成および管理できるため、マシン上の複数のプロセッサを最大限に活用できます。スレッドが同じメモリ空間を共有するスレッドとは異なり、プロセスごとに個別のメモリ空間を使用することで並列実行を実現できます。以下は、マルチプロセッシング モジュールで一般的に使用されるクラスとメソッドのリストと簡単な例です。

1. プロセス

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

2.start()

プロセスのアクティビティを開始します。

p = Process(target=print_numbers)
p.start()  # Runs the target function in a separate process

3. join([タイムアウト])

join() メソッドが呼び出されるプロセスが終了するまで、呼び出しプロセスをブロックします。オプションで、タイムアウトを指定できます。

p = Process(target=print_numbers)
p.start()
p.join(2)  # Waits up to 2 seconds for the process to finish

4. is_alive()

プロセスがまだ実行中の場合は True を返します。

p = Process(target=print_numbers)
p.start()
print(p.is_alive())  # True if the process is still running

5. current_process()

呼び出しプロセスを表す現在の 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

6. active_children()

現在有効なすべてのプロセス オブジェクトのリストを返します。

p1 = Process(target=print_numbers)
p2 = Process(target=print_numbers)
p1.start()
p2.start()

print(Process.active_children())  # Lists all active child processes

7.cpu_count()

マシンで使用可能な CPU の数を返します。

from multiprocessing import cpu_count

print(cpu_count())  # Returns the number of CPUs on the machine

8. プール

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]

9. 待ち行列

キューは、複数のプロセス間でデータを受け渡して通信できるようにする共有データ構造です。

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()

10.ロック

ロックにより、一度に 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()

11. 値と配列

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

12.パイプ

パイプは、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()

13. マネージャー

マネージャーを使用すると、複数のプロセスが同時に変更できるリストや辞書などの共有オブジェクトを作成できます。

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"]

14. セマフォ

セマフォを使用すると、リソースへのアクセスを制御し、一度に特定の数のプロセスのみにアクセスを許可できます。

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。