ホームページ バックエンド開発 Python チュートリアル Python で Ctrl+C を使用してマルチスレッド プログラムを終了する問題を解決する

Python で Ctrl+C を使用してマルチスレッド プログラムを終了する問題を解決する

Jun 16, 2016 am 08:46 AM
ctrl+c

复制代码代码如下:

#!/bin/env python
# -*-coding: utf- 8 -*-
#filename: peartest.py

インポート スレッド、シグナル

is_exit = False

def doStress(i, cc):
global is_exit
idx = i
ただし is_exit:
if (idx < 10000000):
print "thread[%d]: idx=%d"%(i, idx)
idx = idx + cc
else:
Break
print "thread[%d] complete."%i

def handler(signum, Frame):
global is_exit
is_exit = True
print "シグナル %d を受信, is_exit = %d"%(signum, is_exit)

if __name__ == "__main__":
signal.signal(signal.SIGINT) , handler)
signal.signal(signal.SIGTERM, handler)
cc = 5
for i in range(cc):
t = threading.Thread(target=doStress, args=(i ,cc))
t.start()

上は、サービスに直接リクエストを送信するのではなく、各オンライン プログラムごとに 1 個 (cc) ずつ送信され、その数が 1 つずつ印刷される模倣プログラムです。自分の仕事が完了すると、プロセスは正常に終了します。ただし、途中で退出する場合 (圧力測定プログラムを試していますが、途中で問題が発生したため、テストを停止する必要があります)、このタスクは ps で当然ながらプロセス番号を検出できます。上の例では、この信号を捕捉し、全体の値 is_exit を変更して、この値を検出して終了します。ただし、これは非常に頻繁です。

しかし、実際にはこのプログラムは機能せず、Ctrl+C を押している間はプログラムが通常どおり実行され、デーモンでない限り、明らかに Python のサブプログラムです。ただし、デーモンの後にメイン プロセスが終了し、次にプロセス全体がすぐに終了するように設計されているため、すべてのサブ プロセスが終了した後で自身が終了するまで、メイン プロセスで各サブ プロセスの状態を検出する必要もあります。したがって、上の例 29 行の後のコードは次のように変更できます:

复制代码代码如下:

threads=[]
for i in range(cc):
t = threading.Thread(target=doStress, args=(i, cc))
t.setDaemon(True)
thread.append(t)
t.start()
for i in range(cc):
thread[i].join()

もう一度試してみますが、このプロセスでは Ctrl+C も使用されていません。これは、join() 関数も同様に 1 つのネットワーク上で待機しており、メイン プロセスが信号を捕捉できないためです。 ()関数数判断線程が完了したかどうか:

复制代 代码如下:

while 1:
生きている = False
for i in range(cc ):
生きている = 生きているまたはスレッド[i].isAlive()
生きていない場合:
ブレーク

このように変更すると、プログラムは完全に計画どおりに実行されます。各オンライン プロセスで印刷されたすべての数字を印刷することも、途中で Ctrl + C を使用してプロセス全体を実行することもできます。

复制代码代码如下:

#!/bin/env python
# -*-coding: utf-8 -*-
#filename: peartest.py

インポート スレッド、シグナル

is_exit = False

def doStress(i, cc):
global is_exit
idx = i
while not is_exit:
if (idx < 10000000):
print "thread[%d]: idx=%d"%(i, idx)
idx = idx + cc
else:
Break
if is_exit:
print "受信終了シグナル、スレッド [%d] 停止。"%i
else:
print "スレッド [%d] 完了。"%i

def handler(signum, Frame):
global is_exit
is_exit = True
print "シグナル %d を受信, is_exit = %d"%(signum, is_exit)

if __name__ == "__main__":
シグナル.signal(signal.SIGINT, handler)
signal.signal(signal.SIGTERM, handler)
cc = 5
thread = []
for i in range(cc):
t = threading.Thread(target=doStress, args=(i,cc))
t.setDaemon(True)
thread.append(t)
t.start()
while 1:
生きている = False
for i in range(cc):
生きている = 生きている、またはスレッド[i].isAlive()
生きていない場合:
ブレーク

さらに、Python を使用してサービスを書き込む場合も、このようにする必要があります。有料サービスのオンライン プロセスは永続的に要求を受信して​​おり、退出することがないため、Ctrl+C キーを押してサービス全体を削除したい場合は、上に表示されます。圧力測定プログラムはプロセスの 1 つです。引き続き、Python マルチライン プロセス中に Ctrl+C の信号を入力してプロセス全体を停止する必要があります。

1. すべての子回線プロセスをデーモンに設定します。
2. isAlive() 関数を使用して、すべての子回線プロセスが完了するかどうかを判断します。主回線中に join() 関数などを使用して完了するのではありません。
3. Ctrl+C 信号の関数の 1 つにより、全体の局所変化が変更され、各子回線プロセスが検出可能になり、正常に終了します。

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

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

LinuxターミナルでPythonバージョンを表示するときに発生する権限の問題を解決する方法は? LinuxターミナルでPythonバージョンを表示するときに発生する権限の問題を解決する方法は? Apr 01, 2025 pm 05:09 PM

LinuxターミナルでPythonバージョンを表示する際の許可の問題の解決策PythonターミナルでPythonバージョンを表示しようとするとき、Pythonを入力してください...

プロジェクトの基本と問題駆動型の方法で10時間以内にコンピューター初心者プログラミングの基本を教える方法は? プロジェクトの基本と問題駆動型の方法で10時間以内にコンピューター初心者プログラミングの基本を教える方法は? Apr 02, 2025 am 07:18 AM

10時間以内にコンピューター初心者プログラミングの基本を教える方法は?コンピューター初心者にプログラミングの知識を教えるのに10時間しかない場合、何を教えることを選びますか...

中間の読書にどこでもfiddlerを使用するときにブラウザによって検出されないようにするにはどうすればよいですか? 中間の読書にどこでもfiddlerを使用するときにブラウザによって検出されないようにするにはどうすればよいですか? Apr 02, 2025 am 07:15 AM

fiddlereveryversings for the-middleの測定値を使用するときに検出されないようにする方法

あるデータフレームの列全体を、Python内の異なる構造を持つ別のデータフレームに効率的にコピーする方法は? あるデータフレームの列全体を、Python内の異なる構造を持つ別のデータフレームに効率的にコピーする方法は? Apr 01, 2025 pm 11:15 PM

PythonのPandasライブラリを使用する場合、異なる構造を持つ2つのデータフレーム間で列全体をコピーする方法は一般的な問題です。 2つのデータがあるとします...

uvicornは、serving_forever()なしでhttpリクエストをどのように継続的に聞いていますか? uvicornは、serving_forever()なしでhttpリクエストをどのように継続的に聞いていますか? Apr 01, 2025 pm 10:51 PM

UvicornはどのようにしてHTTPリクエストを継続的に聞きますか? Uvicornは、ASGIに基づく軽量のWebサーバーです。そのコア機能の1つは、HTTPリクエストを聞いて続行することです...

文字列を介してオブジェクトを動的に作成し、Pythonでメソッドを呼び出す方法は? 文字列を介してオブジェクトを動的に作成し、Pythonでメソッドを呼び出す方法は? Apr 01, 2025 pm 11:18 PM

Pythonでは、文字列を介してオブジェクトを動的に作成し、そのメソッドを呼び出す方法は?これは一般的なプログラミング要件です。特に構成または実行する必要がある場合は...

See all articles