Pythonのマルチスレッドとマルチプロセッシング
1. はじめに
同時実行性は、今日のコンピューター プログラミングにおいて、特に大量の計算や I/O 操作を必要とするタスクに直面した場合に重要な機能です。Python ではさまざまな同時実行処理メソッドが提供されています。この記事では、そのうちの 2 つであるマルチスレッドとマルチプロセッシングについて詳しく説明し、その使用シナリオ、利点と欠点を分析し、コード例を組み合わせて詳細な解釈を行います。
2、マルチスレッド化
Python のスレッドはthreading
モジュールを使用して実装されます。スレッドは、同じプロセス内で実行される異なるタスクです。
2.1 スレッドの基本的な使い方
Python でスレッドを作成して開始するのは簡単です。簡単な例を次に示します。
import threading
import time
def print_numbers():
for i in range(10):
time.sleep(1)
print(i)
def print_letters():
for letter in 'abcdefghij':
time.sleep(1.5)
print(letter)
thread1 = threading.Thread(target=print_numbers)
thread2 = threading.Thread(target=print_letters)
thread1.start()
thread2.start()
この例では、print_numbers
と のprint_letters
関数は相互に干渉することなく、それぞれのスレッドで実行されます。
2.2 スレッドの同期
スレッドはメモリを共有するため、スレッド間のデータは相互にアクセスできます。ただし、複数のスレッドが同時にデータを変更すると、問題が発生します。この問題を解決するには、ロック (Lock) や条件 (Condition) などのスレッド同期ツールを使用する必要があります。
import threading
class BankAccount:
def __init__(self):
self.balance = 100 # 共享数据
self.lock = threading.Lock()
def deposit(self, amount):
with self.lock: # 使用锁进行线程同步
balance = self.balance
balance += amount
self.balance = balance
def withdraw(self, amount):
with self.lock: # 使用锁进行线程同步
balance = self.balance
balance -= amount
self.balance = balance
account = BankAccount()
特記事項: Python スレッドは Global Interpreter Lock (GIL) によって制限されていますが、IO 集約型タスク (ネットワーク IO やディスク IO など) の場合、マルチスレッドを使用するとプログラムの実行効率が大幅に向上します。
3、マルチプロセス
Python のプロセスはmultiprocessing
モジュールを通じて実装されます。プロセスはオペレーティング システムの実行エンティティであり、各プロセスは独自のメモリ空間を持ち、相互に影響を及ぼしません。
3.1 プロセスの基本的な使用法
Python でのプロセスの作成と開始も非常に簡単です。
from multiprocessing import Process
import os
def greet(name):
print(f'Hello {name}, I am process {os.getpid()}')
if __name__ == '__main__':
process = Process(target=greet, args=('Bob',))
process.start()
process.join()
3.2 プロセス間の通信
プロセスはメモリを共有しないため、プロセス間通信 (IPC) ではパイプ (Pipe)、キュー (Queue) などの特定のメカニズムを使用する必要があります。
from multiprocessing import Process, Queue
def worker(q):
q.put('Hello from
process')
if __name__ == '__main__':
q = Queue()
process = Process(target=worker, args=(q,))
process.start()
process.join()
print(q.get()) # Prints: Hello from process
特記事項: Python のマルチプロセスは、各プロセスに独自の Python インタプリタとメモリ空間があり、並列計算できるため、コンピューティング集中型のタスクには適しています。
もう一つ
concurrent.futures
Python でマルチスレッドとマルチプロセッシングの両方を処理するためのより高度なツールであるモジュールについて詳しく見てみましょう。concurrent.futures
型
このブロックは、非同期で実行されるタスクをスレッドまたはプロセスのプールに入れ、future オブジェクトを通じて実行結果を取得する高レベルのインターフェイスを提供します。このモジュールにより、スレッドとプロセスの操作が容易になります。
以下に例を示します。
from concurrent.futures import ThreadPoolExecutor, as_completed
def worker(x):
return x * x
with ThreadPoolExecutor(max_workers=4) as executor:
futures = {executor.submit(worker, x) for x in range(10)}
for future in as_completed(futures):
print(future.result())
このコードはスレッド プールを作成し、10 個のタスクをスレッド プールに送信します。次に、future オブジェクトを通じて各タスクの結果を取得します。ここでの関数はas_completed
、完了した先物を処理する方法を提供します。
ThreadPoolExecutor
この方法では、に変更するだけで、スレッドとプロセスを簡単に切り替えることができますProcessPoolExecutor
。
IO 集中型のタスクを扱う場合でも、計算集中型のタスクを扱う場合でも、Python のマルチスレッドとマルチプロセッシングは優れたソリューションを提供します。それらの動作メカニズムと適用可能なシナリオを理解することは、プログラムをより適切に設計し、最適化するのに役立ちます。
お役に立ちましたら、WeChat の個人公開アカウントにもっと注目してください: [Python の全体像] TeahLead_KrisChang、インターネットおよび人工知能業界で 10 年以上の経験、テクノロジーおよびビジネス チーム管理で 10 年以上の経験、Tongji Softwareエンジニアリング学士、復丹エンジニアリング管理マスター、Aliyun 認定クラウド サービス シニア アーキテクト、数億の収益を誇る AI 製品ビジネスの責任者。