首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python|多进程的lock机制

Python|多进程的lock机制

作者头像
用户1278550
发布2019-08-12 15:42:03
1.9K0
发布2019-08-12 15:42:03
举报
文章被收录于专栏:idbaidba

一 前言

我们知道Python中多进程是相互执行互不干扰的,但是如果多进程之间需要对同一资源对象进行操作或者多个进程之间有相互依赖的,那就需要一个共享变量供多进程使用。Python multiprocessing 多进程之间相互协调的方式有如下几种: Lock:锁,Queue:队列, Semaphore:信号量 ,Event:事件,Pipe:管道 。

后续文章会逐个介绍这几种方式,本文学习 Lock:锁 。

二 实践

当多个进程需要访问共享资源的时候,Lock可以用来避免访问的冲突。思考一个场景无事务状态下共同访问某个内存变量或者多个进程要访问读写同一个文件。

初始化lock很简单:

lock = Lock() 即可创建一个锁对象,

该对象为全局对象,能被所有的子进程使用。

2.1 no lock
# encoding: utf-8
"""
author: yangyi@youzan.com
time: 2019/8/10 5:48 PM
func:
"""
from multiprocessing import Process, Value, Lock


def sub(num):
    num.value += 1
if __name__ == '__main__':
    lock = Lock() # 创建锁对象
    val = Value('i', 0) # Value是通过共享内存的方式共享数据 初始值 val 为0
    proc = [Process(target=sub, args=(val,)) for i in xrange(100)]
    for p in proc:
        p.start()
    for p in proc:
        p.join()

    print '经过100次累加之后 val 的值是: %d' %val.value

结果

因为共享内存中的val能被同时访问,存在val=90 的时候 ,被多个并发加1结果val=91 ,比如3次,结果就是val=98

2.2 lock
# encoding: utf-8
"""
author: yangyi@youzan.com
time: 2019/8/10 5:38 PM
func:
"""
from multiprocessing import Process, Value, Lock


def sub(num,lock): # 传入的lock对象
    lock.acquire() # 申请锁,lock对象变为locked,并且阻塞其他进程获取lock对象
    num.value += 1
    lock.release() # 释放锁,lock对象变为unlocked,其他进程可以重新获取lock对象
if __name__ == '__main__':
    lock = Lock() # 创建锁对象
    val = Value('i', 0)
    proc = [Process(target=sub, args=(val,lock)) for i in xrange(100)]
    for p in proc:
        p.start()
    for p in proc:
        p.join()

    print '经过100次累加之后 val 的值是: %d' % val.value

利用lock 就能将+1 的动作串行化。确保不会发生写覆盖的现象。

结果

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-08-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 yangyidba 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 二 实践
    • 2.1 no lock
      • 2.2 lock
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档