并发通信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,队列, 互斥锁的更多相关文章
- Java并发编程实战 03互斥锁 解决原子性问题
文章系列 Java并发编程实战 01并发编程的Bug源头 Java并发编程实战 02Java如何解决可见性和有序性问题 摘要 在上一篇文章02Java如何解决可见性和有序性问题当中,我们解决了可见性和 ...
- 进程间通信机制(管道、信号、共享内存/信号量/消息队列)、线程间通信机制(互斥锁、条件变量、posix匿名信号量)
注:本分类下文章大多整理自<深入分析linux内核源代码>一书,另有参考其他一些资料如<linux内核完全剖析>.<linux c 编程一站式学习>等,只是为了更好 ...
- 网络编程并发 多进程 进程池,互斥锁,信号量,IO模型
进程:程序正在执行的过程,就是一个正在执行的任务,而负责执行任务的就是cpu 操作系统:操作系统就是一个协调.管理和控制计算机硬件资源和软件资源的控制程序. 操作系统的作用: 1:隐藏丑陋复杂的硬件接 ...
- 并发编程 - 进程 - 1.互斥锁/2.模拟抢票/3.互斥锁与join区别
1.互斥锁: 互斥锁:Lock 原理就是把并发变成串行,一个一个运行,不错乱,但效率低 保证多个进程修改一块数据时,大家是一个一个修改,不错乱 mutex.acquire() mutex.releas ...
- 并发编程 - 线程 - 1.互斥锁/2.GIL解释器锁/3.死锁与递归锁/4.信号量/5.Event事件/6.定时器
1.互斥锁: 原理:将并行变成串行 精髓:局部串行,只针对共享数据修改 保护不同的数据就应该用不用的锁 from threading import Thread, Lock import time n ...
- golang互斥锁和读写锁
一.互斥锁 互斥锁是传统的并发程序对共享资源进行访问控制的主要手段.它由标准库代码包sync中的Mutex结构体类型代表.sync.Mutex类型(确切地说,是*sync.Mutex类型)只有两个公开 ...
- Python并发编程03 /僵孤进程,孤儿进程、进程互斥锁,进程队列、进程之间的通信
Python并发编程03 /僵孤进程,孤儿进程.进程互斥锁,进程队列.进程之间的通信 目录 Python并发编程03 /僵孤进程,孤儿进程.进程互斥锁,进程队列.进程之间的通信 1. 僵尸进程/孤儿进 ...
- Python之路(第三十八篇) 并发编程:进程同步锁/互斥锁、信号量、事件、队列、生产者消费者模型
一.进程锁(同步锁/互斥锁) 进程之间数据不共享,但是共享同一套文件系统,所以访问同一个文件,或同一个打印终端,是没有问题的, 而共享带来的是竞争,竞争带来的结果就是错乱,如何控制,就是加锁处理. 例 ...
- python并发编程之多进程1--(互斥锁与进程间的通信)
一.互斥锁 进程之间数据隔离,但是共享一套文件系统,因而可以通过文件来实现进程直接的通信,但问题是必须自己加锁处理. 注意:加锁的目的是为了保证多个进程修改同一块数据时,同一时间只能有一个修改,即串行 ...
随机推荐
- iOS开发基础:OC数组对象NSArray的常用方法
本文介绍了OC的数组对象的基本方法的使用: 因为OC的数组中存储的为对象类型,所以我们可以新建一个Person类,通过Person生成对象进行操作. 其中Person.h中的代码为: [objc] v ...
- 利用POI抽取word中的图片并保存在文件中
利用POI抽取word中的图片并保存在文件中 poi.apache.org/hwpf/quick-guide.html 1.抽取word doc中的图片 package parse; import j ...
- XAML实例教程系列 - 事件(Event) 五
Kevin Fan分享开发经验,记录开发点滴 XAML实例教程系列 - 事件(Event) 2012-06-19 01:36 by jv9, 1727 阅读, 7 评论, 收藏, 编辑 Events, ...
- C# MySql Select
MySqlCommand objCmd = new MySqlCommand("select * from `main_db`.`t_realdailyinfo` ", objCo ...
- PCB WebAPI 接口测试工具与接口文档生成
我们自己写WebAPI或调用对方系统提供的WebAPI时,测试WebAPI接口工具用哪些工具呢. 这里将3种WebAPI常用到的工具使用说明.主要是讲对第3种WebApiTestClientWebAp ...
- E20170805-hm
mechanize vt. 使机械化; 用机械装置;
- [转]Linux中set,env和export这三个命令的区别
转自:http://www.2cto.com/os/201306/223758.html Linux中set,env和export这三个命令的区别 set命令显示当前shell的变量,包括当前用户 ...
- Lua相关回调总结【转】
原文 http://www.zaojiahua.com/lua-callback-functions.html 最近做一个小项目,是用Lua写的,中间用到了很多的回调,基本Cocos中的那几种常用回调 ...
- C#图片辅助类,形成缩略图
完善一下别人的方法,成自己好用的工具 using System.Drawing; using System.Drawing.Imaging; namespace GXNUQzzx.Tools.Util ...
- 利用php生成验证码
<?php /** * php生成验证码 * @param $width 画布宽 * @param $height 画布高 * @param $vcodelen 验证码长度 * @param $ ...