2019-04-16-day033-锁与队列
内容回顾
几个问题
- 概念多,练习少
- 不问问题
- 概念?代码?
Process类
- 并发并行
- 并发 是同一时间段内多个任务交替使用同一个cpu
- 并行 是在同一个时刻多个任务在不同的cpu上同时执行
- 同步异步
- 同步 发布一个任务,要等待这个任务结束之后才能继续
- 异步 发布一个任务,不等待这个任务的结束就可以继续执行当前的内容
- 阻塞非阻塞
- 阻塞 : 在当前任务中cpu不工作
- 非阻塞 : cpu还在继续为当前程序在执行
- start terminate join
- start\terminate 异步非阻塞
- join 同步阻塞
- io操作
- i :输入到内存
- o :从内存向外(网络 硬盘)输出
join
import time
import random
from multiprocessing import Process
def done(name):
num = random.uniform(1, 3)
print('start buy %s'%name,num)
time.sleep(num)
print('end buy %s' % name)
if __name__ == '__main__':
l = []
p1 = Process(target=done,args=('橘子',))
p1.start()
l = [p1]
p2 = Process(target=done, args=('苹果',))
p2.start()
l = [p1,p2]
p3 = Process(target=done, args=('榴莲',))
p3.start()
l = [p1, p2,p3]
p1.join() * 等买橘子的那个人回来 只关心p1这个子进程是否执行完
print('买橘子的那个人回来了')
p2.join() * 等买苹果的人回来
print('买苹果的那个人回来了')
p3.join() * 等待榴莲的人回来
print('买榴莲的那个人回来了')
import time
import random
from multiprocessing import Process
def done(name):
num = random.uniform(1, 3)
print('start buy %s'%name,num)
time.sleep(num)
print('end buy %s' % name)
if __name__ == '__main__':
l = ['橘子','苹果','榴莲']
p_l = []
for fruit in l:
p = Process(target=done,args=(fruit,))
p.start()
p_l.append(p)
print(p_l)
for p in p_l:
p.join() # 阻塞 等橘子回来;阻塞 等苹果回来;阻塞 等榴莲回来
join Process模块提供给我们的 对子进程同步管理的方法
import time
import random
from multiprocessing import Process
def done(name):
num = random.uniform(1, 3)
print('start buy %s'%name,num)
time.sleep(num)
print('end buy %s' % name)
if __name__ == '__main__':
l = ['橘子','苹果','榴莲']
for fruit in l:
p = Process(target=done,args=(fruit,))
p.start()
p.join()
开启进程 Process类
实例化的时候引用的参数 : target = 函数名,args=(参数1,)
方法 : start 开启进程 terminate 结束进程 join等待子进程结束
属性 :
- name 进程名 pid进程id
- daemon 一定要在start之前设置,设置
- 个子进程为守护进程,守护进程在主进程的代码结束之后结束
使用类的方式开启子进程
from multiprocessing import Process
class 类名(Process):
def __init__(self,参数1,参数2):
super().__init__()
self.参数1 = 参数1
self.参数2 = 参数2
def run(self):
'''要写在子进程中的代码
可以使用self中的所有参数'''
pass
if __name__ == '__main__':
p = 类名('参数1','参数2')
p.start()
from multiprocessing import Process
def func():pass
if __name__ == '__main__':
Process(target=func).start()
a = 1
print(a)
锁
import json
import time
from multiprocessing import Process,Lock
def search_ticket(name):
with open('ticket',encoding='utf-8') as f:
dic = json.load(f)
print('%s查询余票为%s'%(name,dic['count']))
def buy_ticket(name):
with open('ticket',encoding='utf-8') as f:
dic = json.load(f)
time.sleep(2)
if dic['count'] >= 1:
print('%s买到票了'%name)
dic['count'] -= 1
time.sleep(2)
with open('ticket', mode='w',encoding='utf-8') as f:
json.dump(dic,f)
else:
print('余票为0,%s没买到票' % name)
def use(name,lock):
search_ticket(name)
print('%s在等待'%name)
* lock.acquire()
* print('%s开始执行了'%name)
* buy_ticket(name)
* lock.release()
with lock:
print('%s开始执行了'%name)
buy_ticket(name)
if __name__ == '__main__':
lock = Lock()
l = ['alex','wusir','baoyuan','taibai']
for name in l:
Process(target=use,args=(name,lock)).start()
- 牺牲了效率 保证了数据的安全
- 用户就会觉得很慢 体验很差
锁的应用场景,当多个进程需要操作同一个文件/数据库的时候 ,
会产生数据不安全,我们应该使用锁来避免多个进程同时修改一个文件
队列
- 多个进程之间的数据是隔离的
- 进程之间的数据交互
- 是可以通过网络/文件来实现的
- socket来实现
IPC - inter process communication
- 通过python的模块实现的
- 基于原生socket
- 基于进程队列的 *****
- 第三方的软件/工具来实现 : 基于网络的
- memcache redis rabbitMQ kafka - 软件名
from multiprocessing import Queue # 可以完成进程之间通信的特殊的队列
from queue import Queue #不能完成进程之间的通信
q = Queue()
q.put(1)
q.put(2)
print(q.get())
print(q.get())
from multiprocessing import Queue,Process
def son(q):
print('-->',q.get())
if __name__ == '__main__':
q = Queue()
Process(target=son,args=(q,)).start()
q.put('wahaha')
- 生产者消费者模型
- 获得数据 生产者
- 处理数据 消费者
- 调节生产者的个数或者消费者的个数来让程序的效率达到最平衡和最大化
- 解耦思想
import time
import random
from multiprocessing import Process,Queue
def producer(q):
for i in range(10):
time.sleep(random.random())
food = '泔水%s'%i
print('%s生产了%s'%('taibai',food))
q.put(food)
def consumer(q,name):
while True:
food = q.get() * food = 食物/None
if not food : break
time.sleep(random.uniform(1,2))
print('%s 吃了 %s'%(name,food))
if __name__ == '__main__':
q = Queue()
p1 = Process(target=producer,args=(q,))
p1.start()
c1 = Process(target=consumer,args=(q,'alex'))
c1.start()
c2 = Process(target=consumer,args=(q,'wusir'))
c2.start()
p1.join()
q.put(None)
q.put(None)
如何结束整个程序
import time
import random
from multiprocessing import JoinableQueue,Process
def consumer(jq,name):
while True:
food = jq.get()
time.sleep(random.uniform(1,2))
print('%s吃完%s'%(name,food))
jq.task_done()
def producer(jq):
for i in range(10):
time.sleep(random.random())
food = '泔水%s'%i
print('%s生产了%s'%('taibai',food))
jq.put(food)
jq.join()
if __name__ == '__main__':
jq = JoinableQueue(5)
c1 = Process(target=consumer,args=(jq,'alex'))
p1 = Process(target=producer,args=(jq,))
c1.daemon = True
c1.start()
p1.start()
p1.join()
锁 同一时刻同一段代码,只能有一个进程来执行这段代码
- 保证数据的安全
- 多进程中,只有去操作一些 进程之间可以共享的数据资源的时候才需要进行加锁
- lock = Lock()
- acquire release
- with lock:
- Lock 互斥锁
IPC
- 队列
- PUT
- GET
- 生产者消费者模型 基于队列把生产数据和消费数据的过程分开了
- 补充
- 队列 是进程安全的 自带了锁
- 队列基于什么实现的 文件家族的socket服务
- 基于文件家族的socket服务实现的ipc机制不止队列一个,管道Pipe
- 队列 = 管道 + 锁
- 管道 是基于文件家族的socket服务实现
from multiprocessing import Pipe
2019-04-16-day033-锁与队列的更多相关文章
- 2019.04.16 python基础50
第五十一节 pycharm安装 https://www.jetbrains.com/pycharm/download/#section=windows 这是另一个叫jetbrains公司开发的 默认 ...
- [2019.04.16] 由Python写成的自动解压脚本
很久很久以前(二十七天吧……大概)被要求写一个脚本来检索并解压磁盘上所有的以特定格式命名的tar文件,于是乎学习和摸鱼就一起开始了. 这次要写的脚本,针对的是这样的文件结构: 文件结构如上图所示 可以 ...
- 2019.04.16打卡(java 数组)
1. 要求输出数组中数据的平均值,并输出所有大于平均值的数据 代码 package block; import java.util.*; public class Average { public ...
- day33 锁和队列
队列 #put 和 get #__author : 'liuyang' #date : 2019/4/16 0016 上午 11:32 # 多进程之间的数据是隔离的 # 进程之间的数据交互 # 是可 ...
- 一个无锁消息队列引发的血案(六)——RingQueue(中) 休眠的艺术 [续]
目录 (一)起因 (二)混合自旋锁 (三)q3.h 与 RingBuffer (四)RingQueue(上) 自旋锁 (五)RingQueue(中) 休眠的艺术 (六)RingQueue(中) 休眠的 ...
- 一个无锁消息队列引发的血案(五)——RingQueue(中) 休眠的艺术
目录 (一)起因 (二)混合自旋锁 (三)q3.h 与 RingBuffer (四)RingQueue(上) 自旋锁 (五)RingQueue(中) 休眠的艺术 (六)RingQueue(中) 休眠的 ...
- Linux 内核:匠心独运之无锁环形队列kfifo
Linux 内核:匠心独运之无锁环形队列 Kernel version Linux 2.6.12 Author Toney Email vip_13031075266@163.com Da ...
- PowerBI更新2019/04 - 解决方案架构 - PowerBI Solution Architecture(一图胜万字!)
Power BI 架构图 (2019/04) 1) Power BI Desktop 是一个免费的工具.它可以用来准备和管理数据模型:包括链接各种数据:做数据清洗:定义关系:定义度量值和层级关系:应用 ...
- DPDK 无锁环形队列(Ring)详解
DPDK 无锁环形队列(Ring) 此篇文章主要用来学习和记录DPDK中无锁环形队列相关内容,结合了官方文档说明和源码中的实现,供大家交流和学习. Author : Toney Email : vip ...
- Ubuntu LTS 系统学习使用体会和实用工具软件汇总 6.04 8.04 10.04 12.04 14.04 16.04
Ubuntu LTS 系统学习体会和工具软件汇总 6.04 8.04 10.04 12.04 14.04 16.04 ubuntu入门必备pdf:http://download.csdn.net/de ...
随机推荐
- three.js 3d三维网页代码加密的实现方法
http://www.jiamisoft.com/blog/17827-three-js-3dsanweiwangyejiami.html https://www.html5tricks.com/ta ...
- 【题解】Luogu P5071 [Ynoi2015]此时此刻的光辉
众所周知lxl是个毒瘤,Ynoi道道都是神仙题,题面好评 原题传送门 一看这题没有修改操作就知道这是莫队题(我也只会莫队) 我博客里对莫队的简单介绍 一个数N可以分解成\(p_1^{c_1}p_2^{ ...
- Vim Tricks
Vim Tricks operations replace :$s/from/to/g 全文替换 :10,20s/from/to/g 从第10行开始,替换至第20行 :10,20s/from/to/g ...
- 剑指offer(22)从上往下打印二叉树
题目描述 从上往下打印出二叉树的每个节点,同层节点从左至右打印. 题目分析 从下打印就是按层次打印,其实也就是树的广度遍历. 一般来说树的广度遍历用队列,利用先进先出的特点来保存之前节点,并操作之前的 ...
- Cmd Markdown 编辑阅读器
我们理解您需要更便捷更高效的工具记录思想,整理笔记.知识,并将其中承载的价值传播给他人,Cmd Markdown 是我们给出的答案 -- 我们为记录思想和分享知识提供更专业的工具. 您可以使用 Cmd ...
- CSS粘住固定底部的5种方法
本文主要介绍一个Footer元素如何粘住底部,使其无论内容多或者少,Footer元素始终紧靠在浏览器的底部.我们知道,当内容足够多可以撑开底部到达浏览器的底部,如果内容不够多,不足以撑开元素到达浏览器 ...
- 理解AJAX的原理
1.原生ajax异步请求(ajax的原理) (异步请求:无跳转,无刷新....)通过XMLHttpRequst对象,向服务器发送请求.XMLHttpRequest对象具有一些属性和方法. 1.首先创建 ...
- gym 101081 E. Polish Fortress 几何
E. Polish Fortress time limit per test 2.0 s memory limit per test 256 MB input standard input outpu ...
- sqlserver数据库中sql的使用
目录: 1. 分组排序更新 2. 将查询结果插入到新的表中 3. 创建/更新存储过程 4. 创建/更新视图 5. 插入数据 6. 增加表格的列 7. 创建表格 8. 创建索引 9. 递归查询 1. 分 ...
- [flask]gunicorn配置文件
配置文件 #!/home/xx/.virtualenvs/xx/bin/python # encoding: utf-8 import multiprocessing # 监听端口 bind = '0 ...