gal*_*yan 5 python process multiprocessing
我想知道是否有可能检查每个过程花费多长时间。
例如,有四个工作人员,该工作不应超过10秒,但一个工作人员需要超过10秒。是否可以在10秒后且过程完成工作之前发出警报。
我最初的想法是使用管理器,但似乎我要等到过程完成。
非常感谢。
我很久以前就找到了这个解决方案(在 StackOverflow 的某个地方),我对此非常满意。
基本上,如果进程花费的时间超出预期,它会使用信号引发异常。
您需要做的就是将这两个类添加到您的代码中:
import signal
class TimeoutError(Exception):
"""Custom error for Timeout class."""
pass
class Timeout:
"""A timeout handler with context manager based on UNIX signals."""
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)
Run Code Online (Sandbox Code Playgroud)
以下是其工作原理的一般示例:
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)
Run Code Online (Sandbox Code Playgroud)
就您而言,我会将 with 语句添加到您的工作人员需要执行的工作中。然后你捕获异常并做你认为最好的事情。
或者,您可以定期检查进程是否处于活动状态:
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
Run Code Online (Sandbox Code Playgroud)
您可以在尝试加入后检查进程是否处于活动状态。不要忘记设置超时,否则它会等到作业完成。
这是给你的简单例子
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!"
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
9216 次 |
最近记录: |