Timeout on a Python function call inside timeit
我有一个函数,我们称之为
我仍然很擅长使用
我在Python函数调用和停止代码之后查看了Timeout,这可能是一个问题的重复,但我无法将这些答案与
这样做最好的方法是什么?
编辑:我遇到的一个问题是,我看到的答案是
1 | timeit.Timer('my_function(*args, **kwargs)', setup=setup).timeit(1) |
我不知道如何处理这个表格。
编辑:我在下面使用线程提供的原始答案实际上并不终止线程。通过以下功能运行它可以很容易地显示出来。
1 2 3 4 5 | def foo(x): for i in xrange(1, x + 1): sleep(1) print i return x |
使用涉及
根据在Timeout函数中找到的答案,在python中使用线程不起作用。 如果你在
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | import multiprocessing as mp import timeit def timeout(func, args=(), kwargs=None, TIMEOUT=10, default=None, err=.05): if hasattr(args,"__iter__") and not isinstance(args, basestring): args = args else: args = [args] kwargs = {} if kwargs is None else kwargs pool = mp.Pool(processes = 1) try: result = pool.apply_async(func, args=args, kwds=kwargs) val = result.get(timeout = TIMEOUT * (1 + err)) except mp.TimeoutError: pool.terminate() return default else: pool.close() pool.join() return val def Timeit(command, setup=''): return timeit.Timer(command, setup=setup).timeit(1) def timeit_timeout(command, setup='', TIMEOUT=10, default=None, err=.05): return timeout(Timeit, args=command, kwargs={'setup':setup}, TIMEOUT=TIMEOUT, default=default, err=err) |
经过一些更多的讨论,我有一个基于Timeout函数的初始答案使用线程。 我仍然希望听到任何有更好想法的人,因为我还是新手。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 | def timeout(func, args=None, kwargs=None, TIMEOUT=10, default=None, err=.05): if args is None: args = [] elif hasattr(args,"__iter__") and not isinstance(args, basestring): args = args else: args = [args] kwargs = {} if kwargs is None else kwargs import threading class InterruptableThread(threading.Thread): def __init__(self): threading.Thread.__init__(self) self.result = None def run(self): try: self.result = func(*args, **kwargs) except: self.result = default it = InterruptableThread() it.start() it.join(TIMEOUT* (1 + err)) if it.isAlive(): return default else: return it.result def timeit_timeout(command, setup='', TIMEOUT=10, default=None, err=.05): import timeit f = lambda: timeit.Timer(command, setup=setup).timeit(1) return timeout(f,TIMEOUT=TIMEOUT, default=default, err=err) if __name__ == '__main__': from time import sleep setup = 'gc.enable() from time import sleep' for n in range(1,15): command = 'sleep({})'.format(n) print timeit_timeout(command, setup=setup, default=float('Inf')) |