使用修饰方法进行多处理 - 参数不正确

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 回答进一步讨论了事情..