我想知道是否可以检查每个流程需要多长时间
例如,有四个工人,工作时间不应超过10秒,但工人之一需要10秒以上。在10秒之后和工艺完成工作之前,有办法提出警报。
我最初的想法是使用经理,但似乎我等到过程完成
非常感谢。
答案 0 :(得分:3)
我在很久以前找到了这个解决方案(在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)
在您的情况下,我会将with语句添加到您的工作人员需要执行的作业中。然后你抓住了Exception并且你做了你认为最好的事情。
或者,您可以定期检查进程是否还活着:
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
答案 1 :(得分:1)
尝试加入后,您可以检查进程是否处于活动状态。不要忘记设置超时,否则它会等到工作完成。
以下是您的简单示例
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!"