如何将Lock
对象传递给multiprocessing.Process
的子类?我试过这个,我遇到了酸洗错误。
from multiprocessing import Process
from threading import Lock
class myProcess (Process):
def setLock (self , lock) :
self.lock = lock
def run(self) :
with self.lock :
# do stuff
if __name__ == '__main__' :
lock = Lock()
proc1 = myProcess()
proc1.setLock(lock)
proc2 = myProcess()
proc2.setLock(lock)
proc1.start()
proc2.start()
关于将锁传递给multiprocessing.Pool
有很多回答问题,但没有一个解决了我在 OOP 方法使用Process
时的问题。如果我想做一个全局锁,我应该在哪里定义它,在哪里可以传递给myProcess
对象?
不能使用threading.Lock
进行多处理,需要使用multiprocessing.Lock
。
您会收到酸洗错误,因为无法腌制threading.Lock
,并且您使用的是使用"spawn"作为启动新进程的默认操作系统(Windows 或 macOS 与 Python 3.8+(。
请注意,在分叉操作系统(Linux,BSD...(上,使用threading.Lock
,您不会收到酸洗错误,但锁将被静默复制,不提供您想要的进程之间的同步。
可以使用单独的函数来设置锁,但我更愿意将其作为参数传递,以便与可能的其他参数一起Process.__init__()
。
import time
from multiprocessing import Process, Lock, current_process
class MyProcess(Process):
def __init__(self, lock, name=None, args=(), kwargs={}, daemon=None):
super().__init__(
group=None, name=name, args=args, kwargs=kwargs, daemon=daemon
)
# `args` and `kwargs` are stored as `self._args` and `self._kwargs`
self.lock = lock
def run(self) :
with self.lock :
for i in range(3):
print(current_process().name, *self._args)
time.sleep(1)
if __name__ == '__main__' :
lock = Lock()
p1 = MyProcess(lock=lock, args=("hello",))
p2 = MyProcess(lock=lock, args=("world",))
p1.start()
p2.start()
p1.join() # don't forget joining to prevent parent from exiting too soon.
p2.join()
输出:
MyProcess-1 hello
MyProcess-1 hello
MyProcess-1 hello
MyProcess-2 world
MyProcess-2 world
MyProcess-2 world
Process finished with exit code 0