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

WBOY
リリース: 2024-09-12 14:17:10
オリジナル
904 人が閲覧しました

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

ソース:dev.to
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!