目录

Manage

队列  先入先出

互斥锁


Manage

进程间的通信是被限制的

from multiprocessing import Process

a = 1

def func():
global a # 声明全局变量
a = 2 # 修改全局变量 func()
print(a) p = Process(target=func)
p.start()
p.join()
print(a)

两个结果,第一个是2,第二个是1-----> 进程内存空间是独立的

解决方案:开辟一个新的进程空间,通过代理器和管理器进行通信

  1, 管理器负责与公共进程通信

  2, 代理负责操作共享空间

from multiprocessing import Process, Manage(管理器)

mgr = Manage() # 先开启一个子进程(守护进程),并且返回一个用来通信的管理器

shared_list = mgr.list()    # 通过Manage管理器开启一个公共l列表空间(代理)

def func(lis):
lis.appent('hello') p = Process(target=func, args=(shared_list, ))
p.start(0
p.join() print(shared_list) --> ['hello']

  这里需要知道,可以开启的代理空间有以下几个:

      mgr.list()    列表

      mgr.dict()    字典

      mgr.Queue()    队列


队列    先入先出

队列操作:

  入列:put()

  出列:get()

  测试空:empty()  近似值

  测试满:funll()  近似值

  队列长度:qsize()  近似值

   任务结束: task_done()

  等待完成:join()

    需要了解的是,队列中存在一个计数器的概念,当put的时候,计数器会加1,当task_done时,计数器减1

    可以用join进行测试,当计数器不是0,队列会阻塞,只有当计数器为0时,才会解阻塞


 互斥锁

线程间的通信不存在限制,但是会存在资源竞争的问题,即同时执行的线程,公用共享资源的时候,会抢占资源,导致数据乱序

所以需要互斥锁来锁定某些操作

在python的原始解释器Cpython中存在着GIL(Global Interpreter Lock,全局解释器锁)因此在解释器执行Python代码

时,会产生互斥锁来限制线程对共享资源的访问,直到解释器遇到I/O操作或者操作次数达到一定数目才会释放GIL。

import threading from Thread, Lock

lock = Lock() # 实例化一个锁

      with lock:
xxxxxxxx
'''
或者:
lock.acquire() # 上锁
xxxxxxxx
lock.release() # 解锁 xxxxxx能少则少
锁不能加太多,会大大下降性能
'''
 from threading import Thread, Lock

 lock = Lock()   # 实例化一个锁的实例
a = 0 def incr(n):  # 自加
global a
for i in range(n):
with lock:
a += 1 def decr(n):  # 自减
global a
for i in range(n):
with lock:
a -= 1 t = Thread(target=incr, args=(1000000, ))
t2 = Thread(target=decr, args=(1000000, ))
t.start()
t2.start()
t.join()
t2.join()
print(a) --> 0 如果不加锁,线程之间会竞争资源,得到的结果是一个随机值

  

并发通信Manage,队列, 互斥锁的更多相关文章

  1. Java并发编程实战 03互斥锁 解决原子性问题

    文章系列 Java并发编程实战 01并发编程的Bug源头 Java并发编程实战 02Java如何解决可见性和有序性问题 摘要 在上一篇文章02Java如何解决可见性和有序性问题当中,我们解决了可见性和 ...

  2. 进程间通信机制(管道、信号、共享内存/信号量/消息队列)、线程间通信机制(互斥锁、条件变量、posix匿名信号量)

    注:本分类下文章大多整理自<深入分析linux内核源代码>一书,另有参考其他一些资料如<linux内核完全剖析>.<linux c 编程一站式学习>等,只是为了更好 ...

  3. 网络编程并发 多进程 进程池,互斥锁,信号量,IO模型

    进程:程序正在执行的过程,就是一个正在执行的任务,而负责执行任务的就是cpu 操作系统:操作系统就是一个协调.管理和控制计算机硬件资源和软件资源的控制程序. 操作系统的作用: 1:隐藏丑陋复杂的硬件接 ...

  4. 并发编程 - 进程 - 1.互斥锁/2.模拟抢票/3.互斥锁与join区别

    1.互斥锁: 互斥锁:Lock 原理就是把并发变成串行,一个一个运行,不错乱,但效率低 保证多个进程修改一块数据时,大家是一个一个修改,不错乱 mutex.acquire() mutex.releas ...

  5. 并发编程 - 线程 - 1.互斥锁/2.GIL解释器锁/3.死锁与递归锁/4.信号量/5.Event事件/6.定时器

    1.互斥锁: 原理:将并行变成串行 精髓:局部串行,只针对共享数据修改 保护不同的数据就应该用不用的锁 from threading import Thread, Lock import time n ...

  6. golang互斥锁和读写锁

    一.互斥锁 互斥锁是传统的并发程序对共享资源进行访问控制的主要手段.它由标准库代码包sync中的Mutex结构体类型代表.sync.Mutex类型(确切地说,是*sync.Mutex类型)只有两个公开 ...

  7. Python并发编程03 /僵孤进程,孤儿进程、进程互斥锁,进程队列、进程之间的通信

    Python并发编程03 /僵孤进程,孤儿进程.进程互斥锁,进程队列.进程之间的通信 目录 Python并发编程03 /僵孤进程,孤儿进程.进程互斥锁,进程队列.进程之间的通信 1. 僵尸进程/孤儿进 ...

  8. Python之路(第三十八篇) 并发编程:进程同步锁/互斥锁、信号量、事件、队列、生产者消费者模型

    一.进程锁(同步锁/互斥锁) 进程之间数据不共享,但是共享同一套文件系统,所以访问同一个文件,或同一个打印终端,是没有问题的, 而共享带来的是竞争,竞争带来的结果就是错乱,如何控制,就是加锁处理. 例 ...

  9. python并发编程之多进程1--(互斥锁与进程间的通信)

    一.互斥锁 进程之间数据隔离,但是共享一套文件系统,因而可以通过文件来实现进程直接的通信,但问题是必须自己加锁处理. 注意:加锁的目的是为了保证多个进程修改同一块数据时,同一时间只能有一个修改,即串行 ...

随机推荐

  1. PCB genesis自制孔点 Font字体实现方法

    一.先看genesis原有Font字体 在PCB工程CAM加孔点字体要求时,通常我们直接用Geneis软件给我们提供了2种孔点字体canned_57与canned_67,但此字体可能不能满足各个工厂个 ...

  2. robotframework - 运行报错提示 No keyword with name 'Open Browser' found.

    用下面的例子为例: 1.输入以上robot脚本提示: 2.经查阅资料,大部分都使用的是selenium2 版本,无法解该的问题,目前小编使用的是selenium3,不知道selenium是哪个版本的话 ...

  3. 【洛谷3648/BZOJ3675】[APIO2014]序列分割(斜率优化DP)

    题目: 洛谷3648 注:这道题洛谷3648有SPJ,要求输出方案.BZOJ3675数据组数较多但不要求输出方案. 分析: 这可能是我第三次重学斜率优化了--好菜啊 这道题首先一看就是个DP.稍微推一 ...

  4. Java系列学习(七)-面向对象

    1.成员变量和局部变量的区别 (1)在类中的位置不同 成员变量:类中 方法外 局部变量:方法中 (2)在内存中的位置不同 成员变量:在堆中 局部变量:在栈中 (3)生命周期不同 成员变量:随着对象的创 ...

  5. Excel文件导入导出

    /**     * 导入Excel文件数据     *      * @param file 将要导入的Excel文件     * @param fileCheckKeyWord 用于判断导入文件是否 ...

  6. Android 微信分享图片

    "; //微信 APPID private IWXAPI iwxapi; private void regToWx() { iwxapi = WXAPIFactory.createWXAPI ...

  7. Android 6.0一个完整的native service

     上一篇博客<Android 6.0 如何添加完整的系统服务(app-framework-kernel)>http://www.cnblogs.com/hackfun/p/7418902. ...

  8. N的阶乘末尾有多少个零?

    在创联ifLab的招新问答卷上看到这么一题 核心问题是: 求N!(N的阶乘)的末尾有多少个零? 由于在N特别大的时候强行算出N!是不可能的,所以肯定要另找方法解决了. 首先,为什么末尾会有0?因为2* ...

  9. Git与SVN版本控制系统

    关于版本控制 什么是版本控制?版本控制是一种记录一个或若干文件内容变化,以便将来查阅特定版本修订情况的系统.在本书所展示的例子中,我们仅对保存着软件源代码的文本文件作版本控制管理,但实际上,你可以对任 ...

  10. js输出非字符串,非null值

    console.log(!"");//非空(true) console.log(!);//非0(true) console.log(!" ");//非空格(fa ...