Python 多进程间的同步

Python 多进程间的同步

Python 多进程间的同步

进程间的同步确保了两个或多个进程不会同时访问同一资源或程序代码,也就是临界区。同时访问可能导致竞态条件,会导致数据损坏。在不同的进程之间发生竞态条件的机会并不高,但是它仍然有可能,尤期是在使用共享内存或访问同一资源时。这些情景可以通过合适的带有内建同步机制的对象或 Lock 对象避免,和我们在多线程编程时类似。

我们之前演示过 queuectype 数据类型(把 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 葡萄

如果我们不使用锁,不同进程的输出会混合在一起。

<完>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

dowhileprogramming

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值