使用修饰方法进行多处理 - 参数不正确
Multi-processing with decorated methods - the parameter is incorrect
我正在尝试在 windows 10 和 Python 3.10.1 上使用多处理。
如果该方法有装饰,则此代码失败:
from multiprocessing import Process
def profiler(func):
def wrap(*args, **kwargs):
result = func(*args, **kwargs)
return result
return wrap
@profiler
def go_around(num):
print(num)
if __name__ == '__main__':
p = Process(target=go_around, args=(1,))
p.start()
p.join()
我收到这个错误:
File "", line 1, in
File "C:\Python\Python310\lib\multiprocessing\spawn.py", line 102, in spawn_main
source_process = _winapi.OpenProcess(
OSError: [WinError 87] The parameter is incorrect
请注意,这曾经适用于 python 2.7。
知道为什么会发生这种情况以及如何解决它吗?
python pickling 需要拉取原函数才能重新构造被装饰的函数,并且已经不在命名空间中(因为已经被装饰了。)使用装饰器functools.wraps
on wrapped function 将原始函数的副本存储在新函数的 __dict__ 中,以便以后可以访问它。在某些边缘情况下这可能不起作用(类..)但对于简单的装饰器,它应该起作用:
from multiprocessing import Process
import functools
def profiler(func):
@functools.wraps(func)
def wrap(*args, **kwargs):
result = func(*args, **kwargs)
print("I profiled your function for you :)")
return result
return wrap
@profiler
def go_around(num):
print(num)
if __name__ == '__main__':
p = Process(target=go_around, args=(1,))
p.start()
p.join()
This 回答进一步讨论了事情..
我正在尝试在 windows 10 和 Python 3.10.1 上使用多处理。 如果该方法有装饰,则此代码失败:
from multiprocessing import Process
def profiler(func):
def wrap(*args, **kwargs):
result = func(*args, **kwargs)
return result
return wrap
@profiler
def go_around(num):
print(num)
if __name__ == '__main__':
p = Process(target=go_around, args=(1,))
p.start()
p.join()
我收到这个错误:
File "", line 1, in File "C:\Python\Python310\lib\multiprocessing\spawn.py", line 102, in spawn_main source_process = _winapi.OpenProcess( OSError: [WinError 87] The parameter is incorrect
请注意,这曾经适用于 python 2.7。 知道为什么会发生这种情况以及如何解决它吗?
python pickling 需要拉取原函数才能重新构造被装饰的函数,并且已经不在命名空间中(因为已经被装饰了。)使用装饰器functools.wraps
on wrapped function 将原始函数的副本存储在新函数的 __dict__ 中,以便以后可以访问它。在某些边缘情况下这可能不起作用(类..)但对于简单的装饰器,它应该起作用:
from multiprocessing import Process
import functools
def profiler(func):
@functools.wraps(func)
def wrap(*args, **kwargs):
result = func(*args, **kwargs)
print("I profiled your function for you :)")
return result
return wrap
@profiler
def go_around(num):
print(num)
if __name__ == '__main__':
p = Process(target=go_around, args=(1,))
p.start()
p.join()
This 回答进一步讨论了事情..