2016-09-29 5 views
1

各プロセスの所要時間を調べることができるのだろうかと思います。
たとえば、4人のワーカーがいて、ジョブは10秒を超えてはいけませんが、ワーカーの1人は10秒以上かかります.10秒後にプロセスを終了する方法があります。
私の最初の考えはマネージャーを使っていますが、処理が完了するまで待っているようです。
多くのありがとうございます。Pythonマルチプロセッシング - 各プロセスのステータスを確認してください

+1

UnixやWindowsのための簡単な例ですか? –

+0

@alec_djinn Unix – galaxyan

答えて

2

私はこの解決策の時間(StackOverflowのどこかにある)を見つけました。私はそれに非常に満足しています。

基本的には、プロセスが予想よりも多くかかると例外を発生させるためにsignalを使用します。ここで

import signal 

class timeout: 

    def __init__(self, seconds=1, error_message='TimeoutError'): 
     self.seconds = seconds 
     self.error_message = error_message 

    def handle_timeout(self, signum, frame): 
     raise TimeoutError(self.error_message) 

    def __enter__(self): 
     signal.signal(signal.SIGALRM, self.handle_timeout) 
     signal.alarm(self.seconds) 

    def __exit__(self, type, value, traceback): 
     signal.alarm(0) 

は、それがどのように動作するかの一般的な例である:

あなたがする必要があるすべては、あなたのコードにこのクラスを追加することです、あなたの場合は

import time 

with timeout(seconds=3, error_message='JobX took too much time'): 
    try: 
     time.sleep(10) #your job 
    except TimeoutError as e: 
     print(e) 

、私は追加しますあなたの労働者が実行する必要がある仕事への声明。それであなたは例外を捕まえ、あなたはあなたが一番良いと思うことをします。

また、定期的にプロセスが生きているかどうかを確認することができます

timeout = 3 #seconds 
start = time.time() 
while time.time() - start < timeout: 
    if any(proces.is_alive() for proces in processes): 
     time.sleep(1) 
    else: 
     print('All processes done') 
else: 
    print("Timeout!") 
    # do something 
+0

あなたのコンテキスト管理機能が作業者機能を変更するようです。それは良いですが、私の期待は作業者の機能には触れていません。 – galaxyan

+0

ワーカー関数を変更することはありませんが、withステートメントの下にワーカー関数をインデントする必要があります。あなたが実際の関数を公開した場合、 'timeout'を使ってその実装を実装しようとすることができます。 –

0

あなたは、あなたがそれに参加しようとした後、プロセスが生きているかどうかを確認することができます。タイムアウトを設定することを忘れないでください。さもなければ、ジョブが終了するまで待つでしょう。ここで

はあなた

from multiprocessing import Process 
import time 

def task(): 
    import time 
    time.sleep(5) 

procs = [] 

for x in range(2): 
    proc = Process(target=task) 
    procs.append(proc) 
    proc.start() 

time.sleep(2) 

for proc in procs: 
    proc.join(timeout=0) 
    if proc.is_alive(): 
     print "Job is not finished!" 
関連する問題