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

问题描述 投票:5回答:2

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

python process multiprocessing
2个回答
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
投票

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

这是一个简单的例子

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!"
© www.soinside.com 2019 - 2024. All rights reserved.