2016-09-29 82 views
1

我想知道是否有可能檢查每個進程需要多長時間。例如,
例如,有四名工人,工作時間不應超過10秒,但其中一名工人需要超過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!"