6

いくつかの「潜在的な回答」への回答

  • スレッドに「割り込み」を振りかける必要があります

    長いプロセス/無限ループになることを意図してコードを記述しません。開発中に、たまたま無限ループになるコードを誤って記述してしまったため、「スレッドが中断されたかどうかを確認する」というコードを事前に計画することはできません。

質問:

Java / Clojure/Swankとインクリメンタルコード開発に慣れてきました。誤って無限ループになるclojure関数を作成して実行するのは非常に簡単です。次に、これが先に進み、JVMをペグして、ラップトップのファンをスピンアップさせます。基本的に、1つの暴走スレッドを取り除くには、JVM全体を強制終了する必要があります。

さて、とにかく私はこれらのclojureスレッドを安全に殺すことができますか?Thread.stopがさまざまな危険な結果をもたらすことをよく知っています(他のスレッドが必要とする可能性のあるロックの保持など...)-しかし、これらは無限ループであるclojure関数です-そして私はそれらを外部で実行しています任意のSTM-したがって、これらのスレッドを安全に強制終了する方法があるかどうか疑問に思っています。

ありがとう!

4

4 に答える 4

8

完全な答えは存在しないと思いますが、不完全ではありますが、それでも役立つことがいくつかあります。

  • 最初にctrl-c ctrl-c、私のよくある間違いの99%を取得する前景スレッドを強制終了するreplからヒットしました。
  • それが失敗した場合、私はターミナルとkillコマンドに行きます。
  • その後、そのM-x slime-quit-lispclojure-jack-in
于 2012-04-21T01:06:46.220 に答える
2

これらのループを作成するマクロを作成すると、そのマクロはループステップにコードを挿入して、/ tmpに一時ファイルが存在するなど、ループを終了することを示すものを定期的にチェックできます。したがって、基本的に無限ループを終了するには、その一時ファイルを作成する必要があります。

于 2012-04-21T06:24:31.623 に答える
0

理論的には、コメントで述べたように、これは本当に解決するのが非常に難しい問題です。

実用的な解決策への最善の希望...

ここでは、実行中のclojureスレッドのアクティビティを強制終了して分析するためのより信頼性が高く安全な方法が必要であると想定しています。。。JPSは、標準のclojureで行うすべてのプロセスを含め、すべてのJavaプロセスを監視するため、このための方法はJPSです。

クラス名を含む特定のJavaクラスのプロセス名を表示するために使用できるため、私は常にこの種のことにJPSを使用します...最初にプロセスを呼び出したクラスを知る能力は、「あなたが実際に殺しているのは何ですか。

doolittle-5:~ Jpeerindex$ jps -l
61133 jline.ConsoleRunner
58998 start.jar
61161 sun.tools.jps.Jps
51866 jline.ConsoleRunner

この場合、「lein repl」(clojure repl)はjline(メインクラスはConsoleRunner)を介して開始されるため、そのように表示されます。

本当に詳細を確認する必要がある場合は、これらのプロセスのいずれかを選択して、jstackで呼び出すことができます。

$> jstack 51866

"Gang worker#0(Parallel GC Threads)" prio = 9 tid = 101802800 nid = 0x1017f9000runnable

「ギャングワーカー#1(並列GCスレッド)」prio = 9 tid = 101803800 nid=0x102301000実行可能

「同時マークスイープGCスレッド」prio=9 tid = 10184e000 nid=0x1093f0000実行可能「VM定期タスクスレッド」prio=10 tid = 1018a4000 nid=0x10a310000条件待ち

「例外キャッチャースレッド」prio=10 tid = 101802000 nid = 0x100704000実行可能なJNIグローバル参照:137

この場合、スレッドに実際の問題があるかどうかを感じ取り、それらを正確に識別し、自信を持って殺すことができます...

于 2012-04-21T03:44:14.103 に答える
0

Eclipse /反時計回りのベータ版には、REPLを停止せずに、スレッドの実行を手動で停止する(制御不能な)オプションがあります。私はあなたがそれを持ちたいのと同じ理由でその機能が大好きです。

それはNREPL0.2.0ベータを利用します、私はclojure.tools.nrepl.middleware.interruptible-evalを通して考えます。Eclipse / CCW NREPL 0.2.0クライアントだけでなく、最新バージョンのREPL-yもこの機能をサポートする必要があります(デフォルトではスレッドを停止するためのCTRL-C、REPLを停止するためのCTRL-D)。

于 2012-04-21T12:19:31.260 に答える