多くのブロックアクションのタイムアウトのシグナルに依存するアプリケーションがあります。例えばpythonスレッドのタイムアウト信号の代替手段
:
def wait_timeout(signum, frame):
raise Exception("timeout")
signal.signal(signal.SIGALRM, wait_timeout)
signal.setitimer(signal.ITIMER_REAL, 5)
try:
while true:
print("zzz")
sleep(1)
except Exception as e:
# timeout
print("Time's up")
は今、私は同じアプローチを使用してマルチスレッドを実装しましたが、すべてのスレッドで私がValueError: signal only works in main thread
を取得します。
シグナルでタイムアウトする方法はスレッドには適用できないと仮定します。 whileループでの操作がブロックし、おそらく永遠に続くされるように、したがってループはif節に到達しない可能性があり、
timeout = 5
start = time.time()
while true:
print("zzz")
sleep(1)
if time.time() <= start+timeout:
print("Time's up)
break
:
残念ながら、私はこのようなものを使用することはできません。
Q:信号でスレッドを実行していたように、タイムアウトを実装する方法を教えてください。
編集:私はPythonでJavaScriptでsetTimeout()
と同様のソリューションを示し、this blog postに遭遇しました。これは可能な解決策かもしれないと私は想定していますが、実際にどのように使用するのかは分かりません。
EDIT2:以下のようには私がメインでスレッドを開始:
p = Popen(["tool", "--param", arg], stdin=PIPE, stdout=PIPE, stderr=STDOUT)
t = Thread(target=process_thread, daemon=True, args=(p,arg1,arg2))
t.start()
process_thread
関数は以下のようにして、tool
の標準出力を処理します。
for line in p.stdout:
# process line of the processes stdout
この処理することができます永遠に、例えば取るtool
は出力を生成しません。 tool
の出力は5秒としましょう。したがって、特定のタイムアウト後にforループを壊す必要があります。
これは私が信号を使用したものですが、明らかにスレッドでは機能しません。
edit3:私はスレッドで歌を使用する方法について、より洗練された正確な例を作成しました。 See the gist here
はどのようにあなたのスレッドを開始していますか?定義するときに 'daemon = True'を設定していますか?もしそうなら、それらのスレッドは 'main'スレッドが死んだときに殺されます。それはあなたがやろうとしていることですか? – Billy
はい、私はデーモンとしてスレッドを開始しています。私は1分でOPを編集します。いいえ、それは私が試みているものではありません、私はOPでそれをよりよく説明しようとします。 – SaAtomic
私はOP @ Billyを更新しました – SaAtomic