gpt4 book ai didi

python - 将 Lock 对象传递给继承 multiprocessing.Process 的类

转载 作者:行者123 更新时间:2023-12-05 03:56:03 26 4
gpt4 key购买 nike

如何将 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 有很多已回答的问题,但没有一个解决了我使用 Process 的 OOP 方法的问题。如果我想创建一个全局锁,我应该在哪里定义它以及在哪里可以将它传递给 myProcess 对象?

最佳答案

您不能使用 threading.Lock 进行多处理,您需要使用 multiprocessing.Lock

你得到 pickling-error 因为 threading.Lock 不能被 pickle 并且你使用的操作系统默认使用“spawn”来启动新进程(Windows 或 macOS with Python 3.8 +).

请注意,在 fork 操作系统(Linux、BSD...)上,使用 threading.Lock,您不会遇到 pickling 错误,但锁会被静默复制,而不是提供您想要的进程之间的同步。

使用单独的函数来设置锁是可能的,但我更愿意将它作为参数传递给 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

关于python - 将 Lock 对象传递给继承 multiprocessing.Process 的类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59740012/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com