Python多重处理-检查每个进程的状态

gal*_*yan 5 python process multiprocessing

我想知道是否有可能检查每个过程花费多长时间。
例如,有四个工作人员,该工作不应超过10秒,但一个工作人员需要超过10秒。是否可以在10秒后且过程完成工作之前发出警报。
我最初的想法是使用管理器,但似乎我要等到过程完成。
非常感谢。

ale*_*inn 8

我很久以前就找到了这个解决方案(在 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)


Dar*_*tik 7

您可以在尝试加入后检查进程是否处于活动状态。不要忘记设置超时,否则它会等到作业完成。

这是给你的简单例子

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)