2017-10-27 11 views
2

あなたがn個のスレッドのループを持っていて、それらをタイムアウトtで1つずつ結合すると、実際の時間はn * tです。なぜなら、1人の子供のタイムアウトカウントの開始threadは最後の子スレッドの終了時刻です。この合計時間をn * tでないtに減らす方法はありますか?タイムアウト付きのPythonマルチスレッドジョイン

答えて

1

はい、あなたは絶対的なタイムアウトを計算し、すべての参加前に、あなたの残りの相対タイムアウトを再計算することができます

# Join the_threads, waiting no more than some_relative_timeout to 
# attempt to join all of them. 

absolute_timeout = time.time() + some_relative_timeout 

for thr in the_threads: 
    timeout = absolute_timeout - time.time() 
    if timeout < 0: 
    break 
    thr.join(timeout) 
    if thr.isAlive(): 
    # we timed out 
    else: 
    # we didn't 

さて、* *このを行う必要がありますかどうかが少し不透明です。 "デーモン"ワーカースレッドが他の手段(グローバル状態テーブル、完了メッセージのキューへのプッシュなど)で完了を伝える方が良いかもしれません。

0

スレッドに参加する理由は、呼び出しスレッドが結合されたスレッドが終了するのを待つためです。子スレッドが(意図的にまたは未処理例外のために)終了すると、親のjoin()呼び出しが返されます。

すべての子スレッドに参加してからタイムアウトが完了するのを待っている場合、メインスレッドは実際にjoin()のポイントを尊重していません。子スレッドが終了するまで実行を停止します。

タイムアウトで子スレッドが完了すると予想される場合、メインスレッドはフルタイムアウトを待つ必要はありません。子スレッドがタイムアウトより長く動作し、子スレッドの実行中に親スレッドの実行を停止させたくない場合は、なぜ子を親にするのですか?join()

+0

私の場合、すべての子スレッドに対してタイムアウトがあります。このタイムアウトでは、親スレッドはブロックし、子スレッドを待機します。このタイムアウトの後、子スレッドが終了したかどうかに関係なく、親スレッドは実行を継続します。 –

関連する問題