ホームページ >よくある問題 >Pythonのスレッドプールとマルチスレッドの違い

Pythonのスレッドプールとマルチスレッドの違い

zbt
zbtオリジナル
2023-06-20 16:51:351461ブラウズ

Python スレッド プールとマルチスレッドの違い: 1. スレッドはプロセスの下で移動します; 2. スレッドはプロセスの下で移動します; 3. プロセスには複数のスレッドを含めることができます; 4. プロセス間でデータを共有するのは困難です異なるプロセス ;5. プロセスはスレッドよりも多くのコンピュータ リソースを消費します。

Pythonのスレッドプールとマルチスレッドの違い

1. スレッドとマルチスレッド

プロセス: プログラムが実行されるとき、それはプロセスと呼ばれることがあります。プログラムおよびプログラムによって使用されるメモリとシステム リソース。プロセスは複数のスレッドで構成されます。

スレッド: スレッドはプログラム内の実行ストリームです。各スレッドには独自のプライベート レジスタとコード領域があります。共有されています。異なるスレッドで同じ機能を実行できます。

複数のスレッド: マルチスレッドとは、プログラムに複数の実行ストリームが含まれていることを意味します。つまり、プログラムは複数の異なるスレッドを同時に実行して異なるタスクを実行でき、単一のプログラムで複数の並列実行スレッドを作成してそれぞれのタスクを完了できます。

マルチスレッドの最大の利点: CPU 使用率の向上 (特に I/O 集中型のプログラムに適しており、速度の向上が特に顕著です)

プロセスとスレッドの違い:

単純なメタファーであること: プロセス = 列車、スレッド = 馬車

スレッドはプロセスの下を移動します (単純な馬車は実行できません)

プロセスには複数のスレッドを含めることができます (列車には複数の馬車を含めることができます) )

異なる工程間でデータを共有するのが難しい(駅の乗り換えなど、ある列車に乗っている乗客が別の列車に乗り換えるのが難しい)

異なる工程間でデータを共有するのが非常に難しい同じプロセス内の異なるスレッド 共有が容易 (車両 A から車両 B への変更が簡単)

#プロセスはスレッドよりも多くのコンピュータ リソースを消費します (複数の車両を使用すると、複数の車両よりも多くのリソースが消費されます)

プロセス間 相互に影響を与えることはありません。1 つのスレッドがハングアップすると、プロセス全体がハングアップします (ある列車は他の列車に影響を与えませんが、列車の中間車両が火災になると、すべての車両に影響します)。

プロセスは複数のマシンに拡張でき、最大複数のコアに適しています (異なる列車が複数の線路で走行でき、同じ列車の車両が異なる線路で走行することはできません)

プロセスによって使用されるメモリ アドレスはロックされる可能性があります。つまり、スレッドが共有メモリを使用する場合、他のスレッドはそのメモリを使用する前に共有メモリの終了を待つ必要があります。 (例: 電車のトイレ) - 「ミューテックス ロック」

プロセスが使用するメモリ アドレスにより、使用を制限できます (例: 電車内のレストラン、最大人数のみが許可されます)入るには、満員の場合はドアで待つ必要があります。誰かが出てくるのを待ってから入る必要があります)-「セマフォ」

2. マルチスレッド スレッド クラス

スレッドclass は最も一般的に使用されるマルチスレッド モジュールです。スレッドの作成方法は次のとおりです:

threading.Thread(group=None, target=None, name=None, args=(), kwargs={}, *, 
daemon=None)

group: デフォルトは None です。

target: 作成する関数の名前

name: スレッドの名前。デフォルトは 'Thread-N' Form.

args: 呼び出し可能関数のパラメータタプルパラメータ target で渡されるオブジェクト。

#kwargs: パラメータ target で渡される呼び出し可能オブジェクトのキーワード引数辞書。

daemon: デーモン モード属性、デフォルトはなし。

スレッド オブジェクトの重要なメソッド:

start(): スレッドを開始します。スレッド内で run() メソッドが独立して呼び出されます。

run(): これメソッドはスレッドのアクティビティを表します。

join(timeout=None): スレッドが終了するまで現在の呼び出し元スレッドを待機させます。

daemon: スレッドがデーモン スレッドであるか (True または False) を示します。

マルチスレッド インスタンスを作成します:

import random
import threading
import time
def awesome_function(name):
wait_time = random.randint(1, 10)
print('current thread name is :{0} and wait {1} s'.format(name, 
wait_time))
time.sleep(wait_time)
print('thread {} finished.'.format(name))
if __name__ == '__main__':
for i in range(0, 3):
t = threading.Thread(target=awesome_function, args=(i,))
t.start()

まず、記録した実行結果を確認してください:

上記の例では 3 つのスレッドが開始され、3 つのスレッドがタスクを同時に実行します。 . タスクを最初に完了したスレッド (time.sleep が最も短いスレッド) が最初に結果を出力します。

3. よりよく使用されるスレッド プール クラス ThreadPoolExecutor

新しいスレッドの開始は次のとおりです。オペレーティング システムとの対話が必要なため、非常に高価です。この場合、特に短い存続期間で多数のプログラムを作成する必要がある場合、スレッド プールを使用するとプログラムのパフォーマンスが大幅に向上します。スレッドを使用するときは、スレッド プールの使用を検討する必要があります。スレッド プール。

スレッド プールは、システムの起動時に多数のアイドル スレッドを作成します。プログラムがスレッド プールに関数を送信している限り、スレッド プールは実行のためにアイドル スレッドを開始します。関数の実行が終了しても、スレッドは終了せず、再びスレッド プールに戻り、アイドル状態になり、次の関数を待ちます。同時に、スレッド プールを使用すると、スレッドの同時実行スレッド数を効果的に制御できます。システムに多数の同時スレッドが含まれていると、システムのパフォーマンスが急激に低下し、Python インタプリタがクラッシュすることさえあります。スレッド プールの最大スレッド数パラメータは、システム内の同時スレッドの数を制御できます。

現在主流で使用されているスレッド プールは、concurrent.futures モジュールの ThreadPoolExecutor です:

import random
import time
from concurrent.futures import ThreadPoolExecutor
def awesome_function(name):
wait_time = random.randint(1, 10)
print('current thread name is :{0} and wait {1} s'.format(name, 
wait_time))
time.sleep(wait_time)
print('thread {} finished.'.format(name))
if __name__ == '__main__':
with ThreadPoolExecutor(max_workers=3) as t:
for i in range(0, 3):
t.submit(awesome_function, i)

実行結果は次のように記録されます:

最大容量 3 のスレッド プール オブジェクトを作成し、submit を通じてサブミットします。 実行された関数はスレッド プールに入れられます。スレッド プール内のスレッド (スレッド 2) 実行が完了すると、アイドル状態のスレッド (スレッド 3) がプールに入れられるなど、すべてのスレッドが完了するまでプログラムが終了します。

以上がPythonのスレッドプールとマルチスレッドの違いの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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