Python进程超时行为异常:与被调用函数返回值相关
问题与代码
import multiprocessing import time from multiprocessing import Process import numpy as np def run_process_timeout_wrapper(function, args, timeout): def aux(n, out_q): res = function(*n) out_q.put(res) # to get result back from thread target result_q = multiprocessing.Queue() p = Process(target=aux, args=(args, result_q)) p.start() x = result_q.get() p.join(timeout=timeout) p.terminate() if p.is_alive(): p.terminate() raise multiprocessing.TimeoutError("Timed out after waiting for {}s".format(timeout)) return x def foo(x): return [(np.random.rand(50000), 0.993) for _ in range(10)] def bar(x): return x def foobar(x): res = [(np.random.rand(50000), 0.993) for _ in range(10000)] return res if __name__ == '__main__': t1 = time.time() res = run_process_timeout_wrapper(foo, (110,), 40) print(time.time() - t1) t1 = time.time() res1 = run_process_timeout_wrapper(bar, (110,), 40) print(time.time() - t1) t1 = time.time() res2 = run_process_timeout_wrapper(foobar, (110,), 1) print(time.time() - t1)
原问题
运行上述程序时,第一个调用foo的进程耗时40秒,第二个调用bar的进程耗时接近0秒。虽然明白返回大数组比单个值耗时更长,但这两个函数的实际计算时间都远小于40秒,对此结果感到困惑。
更新问题
感谢关于调整result_q.get()与p.join()顺序的解答,但又出现新问题:foobar任务本应在1秒后超时终止并抛出TimeoutError,但实际无法终止进程。
内容的提问来源于stack exchange,提问作者julian
相关产品推荐
相关产品推荐

