在装饰器中使用多处理失败(无法腌制<函数test_func>:它与__main__.test_func不是同一个对象)



我想使用multiprocessing装饰器通过超时停止函数test_func。当我不使用decorator (committed just_func())时,带有test_func的进程被成功杀死。但是当我在decorator function_to_process中做同样的事情时,我得到了错误信息:

_pickle.PicklingError: Can't pickle <function test_func at 0x000001647506BAE8>: it's not the same object as __main__.test_func  
PS C:datatemp> Traceback (most recent call last):
File "<string>", line 1, in <module>
File "C:Program FilesPython36libmultiprocessingspawn.py", line 99, in spawn_main
new_handle = reduction.steal_handle(parent_pid, pipe_handle)  File "C:Program FilesPython36libmultiprocessingreduction.py", line 82, in steal_handle
_winapi.PROCESS_DUP_HANDLE, False, source_pid)
OSError: [WinError 87] The parameter is incorrect

你能告诉我我做错了什么以及如何修复吗?一般来说,我尝试为pytest_timeout的windows部分创建解决方案,通过test来杀死test_case,而不是整个testronguite。

谢谢!

代码:

import time
import multiprocessing
def function_to_process(func):
def process_wrapper():
process = multiprocessing.Process(target=func, args=())
process.start() 
process.join(timeout=5)
if (process.is_alive):
process.terminate()
print("done in decorator")        
return process_wrapper
@function_to_process
def test_func():
time.sleep(10)
def just_func():
process = multiprocessing.Process(target=test_func, args=())
process.start()
process.join(timeout=5)
if (process.is_alive):
print("terminated")
process.terminate()
if __name__ == "__main__":
print("start")    
test_func()
#    just_func()
print("done in main")

我已经找到了解决方案在这里Windows:使用装饰器与multiprocessing

最新更新