Python 运行时多处理锁崩溃的装饰程序
我正在尝试多处理,并尝试将锁与decorator一起使用,以方便使用,但它在运行时崩溃Python 运行时多处理锁崩溃的装饰程序,python,python-3.x,multiprocessing,Python,Python 3.x,Multiprocessing,我正在尝试多处理,并尝试将锁与decorator一起使用,以方便使用,但它在运行时崩溃 def lock_dec(func): def wrapper(*args , **kwargs): Lock().acquire() func(args) Lock().release() return wrapper 是装修工吗 @lock_dec def add_no_lock(total): for i in range(10
def lock_dec(func):
def wrapper(*args , **kwargs):
Lock().acquire()
func(args)
Lock().release()
return wrapper
是装修工吗
@lock_dec
def add_no_lock(total):
for i in range(100):
time.sleep(0.01)
total.value += 5
这就是函数
add_process = Process(target = add_no_lock , args = (total , ))
add_process.start()
我得到了这个错误,但我无法调试代码
无法pickle local object'lock\u dec..wrapper
在24小时的尝试和调试后编辑我通过使用带参数的装饰器找到了解决方案
def loc_dec_parent(*args , **kwargs):
def lock_dec(func):
@wraps(func)
def wrapper(*arg , **kwarg):
kwargs['lock'].acquire()
func(*arg)
kwargs['lock'].release()
return wrapper
return lock_dec
功能是
@loc_dec_parent(lock = Lock())
def add_no_lock(total):
for i in range(100):
time.sleep(0.01)
total.value += 5
这对我来说是可行的Pickle无法处理闭包:一般来说,对于锁定,您还需要将相同的Lock()实例传递给使用锁的每个函数,因此调用
Lock().acquire()
和Lock().release()
没有效果。查看同步文档:是否有任何方法可以工作哇哦,对不起,请查看上面我的更新-您不能使用这样的装饰器进行锁定,因为您无论如何都需要将锁实例作为参数传递给流程目标函数。我考虑过这一点,并尝试了不同的方法,但没有得到“参数不正确”`