Python 多进程间的同步
Python 多进程间的同步
进程间的同步确保了两个或多个进程不会同时访问同一资源或程序代码,也就是临界区。同时访问可能导致竞态条件,会导致数据损坏。在不同的进程之间发生竞态条件的机会并不高,但是它仍然有可能,尤期是在使用共享内存或访问同一资源时。这些情景可以通过合适的带有内建同步机制的对象或 Lock
对象避免,和我们在多线程编程时类似。
我们之前演示过 queue
和 ctype
数据类型(把 Lock
设置为 True
)的使用,它们是多进程安全的。在下面的示例中,我们将演示使用 Lock
对象来确保同一时间只有一个进程使用控制台输出。我们使用 Pool
对象创建进程,并且把同一个 Lock
对象传递给所有的进程。我们使用的 Lock
对象来自于 Manager
对象,而不是来自于 multiprocessing
包。我们还使用了 partial
函数把 Lock
对象绑定到每个进程,一起被绑定的还有一个会被分发到每个进程函数的列表。下面是完整的代码:
import os
from functools import partial
from multiprocessing import Pool, Manager
def printme(lock, msg):
lock.acquire()
try:
print("{} {}".format(os.getpid(), msg))
finally:
lock.release()
def main():
with Pool(3) as proc:
lock = Manager().Lock()
func = partial(printme, lock)
proc.map(func, ["桔子", "苹果", "梨", "葡萄"])
print("退出主进程。")
if __name__ == '__main__':
main()
上面的代码的输出结果是:
10956 梨
2776 桔子
6100 苹果
10956 葡萄
如果我们不使用锁,不同进程的输出会混合在一起。
<完>