最终目标是在后台执行一个方法,但不是并行:当多个对象调用此方法时,每个对象都应该等待轮到它们继续执行。为了实现在后台运行,我必须在子进程(而不是线程)中运行该方法,并且我需要使用spawn(而不是fork)来启动它。为了防止并行执行,显而易见的解决方案是在进程之间共享全局锁。
当进程被分叉时(这是 Unix 上的默认设置),很容易实现,如以下两个代码中所强调的那样。
我们可以将它作为类变量共享:
import multiprocessing as mp
from time import sleep
class OneAtATime:
l = mp.Lock()
def f(self):
with self.l:
sleep(1)
print("Hello")
if __name__ == "__main__":
a = OneAtATime()
b = OneAtATime()
p1 = mp.Process(target = a.f)
p2 = mp.Process(target = b.f)
p1.start()
p2.start()
Run Code Online (Sandbox Code Playgroud)
或者我们可以将它传递给方法:
import multiprocessing as mp
from time import sleep
class OneAtATime:
def f(self, l):
with l:
sleep(1)
print("Hello")
if __name__ == "__main__":
a = OneAtATime()
b = OneAtATime()
m = mp.Manager()
l = mp.Lock() …Run Code Online (Sandbox Code Playgroud)