GIL(Global Interpreter Lock)が存在するため、PythonプロセスはCPUの1つのコア、つまり対応するオペレーティングシステムの1つのみを同時に使用できます。
カーネルスレッド、Python Webプログラムの場合、要求があり、それが時間のかかるコンピューティングタスク(職業)である場合、このプログラムは最初の要求を受け取ります
他のリクエストを処理できますか? Webプログラムがリクエストを受信した場合、Trueの間です。
def handle_request(request):while True:
pass
コードの観点から見ると、Pythonには実際の実行スレッドが1つしかありません。コードが「whileTrue」になると、CPUコアを1つだけ占有し、処理する機会があります。
他のタスク?
Trueの間に実行するために両方のスレッドを開始し、2つの要求をシミュレートするために実行できるかどうかを観察してみましょう。
import time, threading
def f1(name):while True:print(name)
time.sleep(1)
threading.Thread(target=f1, args=('f1',)).start()
threading.Thread(target=f1, args=('f2',)).start()
出力結果:
f1
f2
f2f1
f2
f1
…
実際、Django(Python Webフレームワーク)を使用してテストすると、リクエストが「while True」のようなコードを実行した場合でも、他のリクエストを処理できます(同時実行をサポート)。
両方の whileTrue
を実行できる理由を説明するには:
GILロックは引き続き使用されます。最初の while True
スレッドは、実行する前にこのロックを実行できます。次に、print(name)
を実行してから、ロックを解放します。
一時停止してから、2番目の while True
スレッドがGILを取得して実行を開始し、GILの周囲で交互に実行することで、Pythonのマルチスレッドを実現します。
結論として:
True
は常にCPUリソースを保持できるわけではありませんが、しばらくの間実行され、しばらく休止するため、他のプロセスにチャンスが与えられます。2つの重要なポイントがあります。
ロックをつかんで並べます。ロック用のキューを配置し、実行する場合はこのキューに入ります。
ロック解除は、プロセスのスケジューリングにいくぶん似ています。
IO操作が発生した場合は、IOデバイスが計算を完了するのを待ってからスレッドの実行を続行する必要があります。この間、CPUリソースは占有されず、最初にロックが解放されます。
積極的に待機し、通常はスリープし、積極的にロックを解除し、特定の時間まで待機してから再実行します。
上記の分析は、Pythonが並行性をサポートしていることを示していますが、マルチコアプロセッサを利用できないため、多数の同時コンピューティング集約型アプリケーションに対して
Pythonの使用には適していません。
Recommended Posts