我在Windows 7上运行Python 3.4。

我试图了解有关多处理的更多信息,并试图编写一个对另一个函数调用执行干净超时的函数。但是我遇到了一个我无法解决的问题。

根据有关多处理的Python文档:


  Terminate()“立即停止工作进程,而无需完成出色的工作。”


但是,当我对此进行测试时,pool.terminate()似乎在等待辅助进程完成而不是杀死它们!

因此,当我运行此代码时:

import multiprocessing.pool
from time import sleep

def timeout(seconds, function, *args, **kwargs):

    pool = multiprocessing.pool.ThreadPool(processes = 1)
    result = pool.apply_async(function, args, kwargs)

    try: result.get(seconds)
    except multiprocessing.context.TimeoutError:
        print("Process timed out")
        pool.terminate()
        pool.join()
        print("Pool terminated")
    finally:
        pool.close()

def worker():
    for n in range(5):
        sleep(1)
        print(n+1)
    print("Process succeeded")

timeout(2.5, worker)


我希望结果是这样的:

1
2
Process timed out
Pool terminated


但是我得到了这个:

1
2
Process timed out
3
4
5
Process succeeded
Pool terminated


我知道result.get会引发TimeoutError,因为成功打印了“处理超时”消息。而且我知道pool.terminate()之所以被调用是出于同样的原因,它似乎什么都没做!

我觉得这里有些东西我只是不了解。有人可以帮我吗?

最佳答案

我不知道为什么,但是问题似乎是由pool.join()调用引起的,无论如何您实际上并不需要此调用,因为据称工作进程是由前面的terminate()调用终止的。

import multiprocessing.pool
from time import sleep

def timeout(seconds, function, *args, **kwargs):
    pool = multiprocessing.pool.ThreadPool(processes=1)
    result = pool.apply_async(function, args, kwargs)
    try:
        result.get(timeout=seconds)
    except multiprocessing.TimeoutError:
        print("Process timed out")
    pool.terminate()
#    pool.join()  # Don't need this, all worker threads have been stopped.
    print("Pool terminated")

def worker():
    for n in range(5):
        sleep(1)
        print(n+1)
    print("Process succeeded")

timeout(2.5, worker)


输出:

1
2
Process timed out
Pool terminated


无论如何,请注意,自版本3.3起,Pool对象支持上下文管理协议,这意味着Pool.terminate()在使用时将被自动调用-因此该函数的编写方式可能更简洁:

def timeout(seconds, function, *args, **kwargs):
    with multiprocessing.pool.ThreadPool(processes=1) as pool:
        result = pool.apply_async(function, args, kwargs)
        try:
            result.get(timeout=seconds)
        except multiprocessing.TimeoutError:
            print("Process timed out")
    print("Pool terminated")

关于python - 多处理线程池未按预期终止,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36651075/

10-11 04:22