ホームページ バックエンド開発 Python チュートリアル コンテキストマネージャーとデーモンスレッド

コンテキストマネージャーとデーモンスレッド

Feb 06, 2024 am 11:27 AM

コンテキストマネージャーとデーモンスレッド

質問の内容

コンテキスト マネージャーからデーモン スレッドを開始しています。デーモン スレッドは毎秒ハートビートを送信することになっていますが、スレッド内で実行されているためです。したがって、例外が発生してもコンテキスト マネージャーは終了しません。ハートビートが停止したときにコンテキストマネージャーで例外を発生させるにはどうすればよいですか?

リーリー

この例を見つけるのに苦労しています。

###ご協力いただきありがとうございます!


正解


更新

投稿したコードとの一貫性を高めるためにコードを変更しました。しかし:###

指定したコードには一貫性がありません:

heartbeat_task

には、設定されている場合は関数が返されるイベントが渡されます。ただし、これは with plc(): を使用して作成された関数 main 内のコンテキスト マネージャーが終了する場合にのみ設定され、実際には設定されません。 heartbeat_task によってスローされた例外を強制的にコンテキスト マネージャーを終了させ、関数 plc でキャッチしたい場合は、stop_event.set() を呼び出すのがポイントです。 ?定義上、例外により heartbeat_task が存在しなくなった場合にのみここに到達するとしたらどうなるでしょうか? したがって、例外がスローされるまで

heartbeat_task

を無期限に実行するか (その場合、「停止」イベントには意味がありません)、または、何らかの条件が存在するときに停止できるようにする必要があります。 heartbeat_task ですが、そのためのコードはありません。デモンストレーションの目的で、mainstop_event イベントにアクセスし、特定の状況下でそれを設定すると仮定します。それ以外の場合は、heartbeat_task が実行されていないことを検出するまで実行されます。これは、おそらく例外が発生したためです (無限ループが実行されています。停止イベントがまだ設定されていない場合、どうやって終了できるでしょうか?) )。残りは、コンテキスト マネージャーを使用する必要がある理由です。後ほど代替案を提案させていただきます。 マルチスレッド プールを使用する場合 (プールから 1 つのスレッドだけが必要です)、プールに送信されたタスクによってスローされた例外をメインスレッドが簡単にキャッチできるようになります。 .apply_async

呼び出されると、

multiprocessing.pool.asyncresult インスタンスを返し、今後の完了を示します。このインスタンスで get メソッドが呼び出されると、ヘルパー関数 (heartbeat_task) から戻り値を取得したり、ヘルパー関数によってスローされた例外を再発生したりできます。ただし、wait メソッドを使用して、送信されたタスクの完了または経過時間を待つこともできます。次に、ready メソッドを使用して、5 秒待機した後に送信されたタスクが実際に完了したかどうか (例外または戻りにより) をテストできます。タスクがまだ実行中の場合は、タスクを停止するように指示できます。このデモでは、約 7 秒後にタスクに例外をスローさせます: リーリー 印刷: リーリー

コンテキスト マネージャーを使用する代わりの方法

リーリー

以上がコンテキストマネージャーとデーモンスレッドの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、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時間しかない場合、何を教えることを選びますか...

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

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

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

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

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