1 进程锁

python编程中,引入了对象互斥锁的概念,来保证共享数据操作的完整性。

每个对象都对应于一个可称为“互斥锁”的标记,这个标记用来保证在任一时刻,只能有一线程访问对象。

在python中我们使用 multiprocessing.Lock 和 threading.Lock 可以实现进程锁控制。

2 示例

2.1 acquire()加锁

from multiprocessing import Lock

lock = Lock()

lock.acquire() #加锁

lock.acquire()#此时阻塞在该函数处

print("lock...")

运行,并没有打印出lock...,函数阻塞。

当一个进程加锁,另外一个进程也加锁时,则会发生此函数运行阻塞。

当一个进程加锁,另外一个进程不加锁时,则另一个函数没有任何限制。

2.2 release()解锁

from multiprocessing import Lock

lock = Lock()

lock.acquire()

lock.release()

print("lock...")

运行:输出 lock...

2.3 加锁与解锁之间的区别

lock.release()解锁后显示

from multiprocessing import Lock

lock = Lock()

lock.acquire()

lock.release()

# lock.acquire()

with lock:
    print("lock...")

运行:

lock...

lock.acquire()加锁后显示

from multiprocessing import Lock

lock = Lock()

lock.acquire()

lock.release()

lock.acquire()

with lock:
    print("lock...")

运行,一直处于阻塞状态,没有输出

此时运行,阻塞在with语句,with 语句运行完毕会自动解锁

2.4 综合应用

from multiprocessing import Process,Lock
import sys,time 

def worker1(stream):
    lock.acquire()
    for i in range(5):
        time.sleep(1)
        stream.write('Lock acquired via\n')
    lock.release()

def worker2(stream):
    with lock:
        for i in range(5):
            time.sleep(1)
            stream.write("lock acquired directly\n")

lock = Lock()

w1 = Process(target = worker1,args = (sys.stdout,))
w2 = Process(target = worker2,args = (sys.stdout,))

w1.start()
w2.start()

w1.join()
w2.join()

worker1 和worker2 都加锁时,两个进程会顺序执行,也即运行完成一个进程再运行第二个进程;当两个进程中最多只有一个进程加锁时,则不会出现进程阻塞的情况。

两个子进程的运行前后不区分,但是一旦一个子程序运行,另一个子程序就会被阻塞,但具体那个子程序先运行,不能完全确定

python学习笔记——多进程中的锁Lock的更多相关文章

  1. python学习笔记——多进程中共享内存Value & Array

    1 共享内存 基本特点: (1)共享内存是一种最为高效的进程间通信方式,进程可以直接读写内存,而不需要任何数据的拷贝. (2)为了在多个进程间交换信息,内核专门留出了一块内存区,可以由需要访问的进程将 ...

  2. python学习笔记—— 多进程中的 孤儿进程和僵尸进程

    1 基本概述 1.1 孤儿进程和僵尸进程 父进程创建子进程后,较为理想状态是子进程结束,父进程回收子进程并释放子进程占有的资源:而实际上,父子进程是异步过程,两者谁先结束是无顺的,一般可以通过父进程调 ...

  3. Python 学习笔记 多进程 multiprocessing--转载

    本文链接地址 http://quqiuzhu.com/2016/python-multiprocessing/ Python 解释器有一个全局解释器锁(PIL),导致每个 Python 进程中最多同时 ...

  4. python 学习笔记 多进程

    要让python程序实现多进程,我们先了解操作系统的相关知识 Unix/Linux操作系统提供了一个fork()系统调用,他非常特殊,普通的函数调用,调用一次,返回一次,但是fork调用一次, 返回两 ...

  5. python学习笔记-多进程

    multiprocessing from multiprocessing import Process import time def f(name): time.sleep(2) print('he ...

  6. Python学习笔记6-Python中re(正则表达式)模块学习

    今天学习了Python中有关正则表达式的知识.关于正则表达式的语法,不作过多解释,网上有许多学习的资料.这里主要介绍Python中常用的正则表达式处理函数. re.match re.match 尝试从 ...

  7. python学习笔记——爬虫中提取网页中的信息

    1 数据类型 网页中的数据类型可分为结构化数据.半结构化数据.非结构化数据三种 1.1 结构化数据 常见的是MySQL,表现为二维形式的数据 1.2 半结构化数据 是结构化数据的一种形式,并不符合关系 ...

  8. python学习笔记——多进程二 进程的退出

    1 进程的退出函数的基础语法 1.1 进程的退出函数 进程的退出含有有os._exit([status])和sys.exit([status])两种,从数据包来看,该退出模块仅在linux或者unix ...

  9. python学习笔记——多进程一 基础概念

    1 进程 进程:程序的一次(从开始到结束)执行过程,属于一个动态过程.是系统进行资源分配和调度的基本单位. 程序:指的是一个文件,磁盘中可执行的代码.属于一个静态文件 注:进程运行时需要把程序加载如内 ...

随机推荐

  1. 中国大学MOOC-陈越、何钦铭-数据结构-笔记

    中国大学MOOC-陈越.何钦铭-数据结构-2017春 跟着<中国大学MOOC-陈越.何钦铭-数据结构-2017春>学习,平时练习一下pat上的作业外:在这里记录一下:平时学习视屏的收获. ...

  2. RecyclerView 判断滑到底部 顶部 预加载 更多 分页 MD

    Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...

  3. python 分词计算文档TF-IDF值并排序

    文章来自于我的个人博客:python 分词计算文档TF-IDF值并排序 该程序实现的功能是:首先读取一些文档,然后通过jieba来分词,将分词存入文件,然后通过sklearn计算每一个分词文档中的tf ...

  4. HDU1161 Eddy&#39;s mistakes

    Eddy's mistakes Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) ...

  5. Java 实例 - 队列(Queue)用法

    队列是一种特殊的线性表,它只允许在表的前端进行删除操作,而在表的后端进行插入操作. LinkedList类实现了Queue接口,因此我们可以把LinkedList当成Queue来用. 以下实例演示了队 ...

  6. Andriod中的依赖注入

    Web后端开发者应该对依赖注入都比较熟悉,至于Android又是如何进行依赖注入的呢?在这篇文章中,让我们一起通过一个例子了解一下在Android中进行依赖注入的好处. AndroidAnnotati ...

  7. MFC 小知识总结二

    1 UpdateData 不能及时更新控件内容 原因: UpdateData是通过数据交换实现改变控件显示的.改变了之后必需要调用一次OnPaint才干实现刷新. 因此,若是在一个函数里重复多次调用有 ...

  8. angular5使用httpclient时解决跨域问题

    跨域问题的环境: 在本地开发时,使用命令行ng s开启服务,访问地址为http://localhost:4200 假设调用数据接口的服务地址为http://localhost:8088/api/dat ...

  9. 页面载入时通过获取GridView某行某列的值来控制某一列的控件属性

    通过获取状态来控制"查看"button的Visible属性值. 在前台GridView中加入 OnRowDataBound="GridView1_RowDataBound ...

  10. HDU1588-Gauss Fibonacci(矩阵高速幂+等比数列二分求和)

    题目链接 题意:g(x) = k * x + b.f(x) 为Fibonacci数列.求f(g(x)),从x = 1到n的数字之和sum.并对m取模. 思路:  设A = |(1, 1),(1, 0) ...