コンテキストマネージャーとデーモンスレッド
コンテキスト マネージャーからデーモン スレッドを開始しています。デーモン スレッドは毎秒ハートビートを送信することになっていますが、スレッド内で実行されているためです。したがって、例外が発生してもコンテキスト マネージャーは終了しません。ハートビートが停止したときにコンテキストマネージャーで例外を発生させるにはどうすればよいですか?
リーリーこの例を見つけるのに苦労しています。
###ご協力いただきありがとうございます!正解
更新
投稿したコードとの一貫性を高めるためにコードを変更しました。しかし:###指定したコードには一貫性がありません:
heartbeat_task には、設定されている場合は関数が返されるイベントが渡されます。ただし、これは with plc():
を使用して作成された関数 main
内のコンテキスト マネージャーが終了する場合にのみ設定され、実際には設定されません。 heartbeat_task
によってスローされた例外を強制的にコンテキスト マネージャーを終了させ、関数 plc
でキャッチしたい場合は、stop_event.set()
を呼び出すのがポイントです。 ?定義上、例外により heartbeat_task
が存在しなくなった場合にのみここに到達するとしたらどうなるでしょうか?
したがって、例外がスローされるまで
を無期限に実行するか (その場合、「停止」イベントには意味がありません)、または、何らかの条件が存在するときに停止できるようにする必要があります。 heartbeat_task
ですが、そのためのコードはありません。デモンストレーションの目的で、main
が stop_event
イベントにアクセスし、特定の状況下でそれを設定すると仮定します。それ以外の場合は、heartbeat_task
が実行されていないことを検出するまで実行されます。これは、おそらく例外が発生したためです (無限ループが実行されています。停止イベントがまだ設定されていない場合、どうやって終了できるでしょうか?) )。残りは、コンテキスト マネージャーを使用する必要がある理由です。後ほど代替案を提案させていただきます。
マルチスレッド プールを使用する場合 (プールから 1 つのスレッドだけが必要です)、プールに送信されたタスクによってスローされた例外をメインスレッドが簡単にキャッチできるようになります。 .apply_async
multiprocessing.pool.asyncresult
インスタンスを返し、今後の完了を示します。このインスタンスで get
メソッドが呼び出されると、ヘルパー関数 (heartbeat_task) から戻り値を取得したり、ヘルパー関数によってスローされた例外を再発生したりできます。ただし、
wait メソッドを使用して、送信されたタスクの完了または経過時間を待つこともできます。次に、
ready メソッドを使用して、5 秒待機した後に送信されたタスクが実際に完了したかどうか (例外または戻りにより) をテストできます。タスクがまだ実行中の場合は、タスクを停止するように指示できます。このデモでは、約 7 秒後にタスクに例外をスローさせます:
リーリー
印刷:
リーリー
コンテキスト マネージャーを使用する代わりの方法
リーリー
以上がコンテキストマネージャーとデーモンスレッドの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

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

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

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

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

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

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

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

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

ホットトピック









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

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

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

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

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

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