【发布时间】:2018-04-20 07:53:55
【问题描述】:
所以在 Windows 上,signal 和 thread 方法通常是坏主意/不适用于函数超时。
我制作了以下超时代码,当代码花费很长时间时,它会从 multiprocessing 抛出 timeout exception。这正是我想要的。
def timeout(timeout, func, *arg):
with Pool(processes=1) as pool:
result = pool.apply_async(func, (*arg,))
return result.get(timeout=timeout)
我现在正在尝试将其添加到装饰器样式中,以便可以将其添加到范围广泛的函数中,尤其是那些调用外部服务并且我无法控制代码或持续时间的函数。我目前的尝试如下:
class TimeWrapper(object):
def __init__(self, timeout=10):
"""Timing decorator"""
self.timeout = timeout
def __call__(self, f):
def wrapped_f(*args):
with Pool(processes=1) as pool:
result = pool.apply_async(f, (*args,))
return result.get(timeout=self.timeout)
return wrapped_f
它给出了一个酸洗错误:
@TimeWrapper(7)
def func2(x, y):
time.sleep(5)
return x*y
File "C:\Users\rmenk\AppData\Local\Continuum\anaconda3\lib\multiprocessing\reduction.py", line 51, in dumps
cls(buf, protocol).dump(obj)
_pickle.PicklingError: Can't pickle <function func2 at 0x000000770C8E4730>: it's not the same object as __main__.func2
我怀疑这是由于多处理和装饰器玩得不好,但我实际上不知道如何让它们玩得好。有关如何解决此问题的任何想法?
PS:我在这个网站和其他地方做了一些广泛的研究,但没有找到任何可行的答案,无论是使用 pebble、线程、作为函数装饰器还是其他方式。如果你有一个你知道适用于 windows 和 python 3.5 的解决方案,我很乐意使用它。
【问题讨论】:
标签: python multiprocessing decorator