day33 锁和队列
队列
#put 和 get
#__author : 'liuyang'
#date : 2019/4/16 0016 上午 11:32
# 多进程之间的数据是隔离的
# 进程之间的数据交互
# 是可以通过网络/文件来实现的
# socket 来实现 # IPC inter process communication
# 多个进程之间的通信
#通过python的模块实现的
# 基于原生socket
# 基于进程队列的 *****
#第三方的软件/工具来实现:
# 不需要写socket(写好了)
# 需要安装
#memcache redis rabbitMQ kafka
# 网络
def son():
pass
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()
# # Process
# q.put('wahah') #生产者消费者模型
#python 程序
#模仿浏览器去访问一个网页
#urllib.urlopen(url)
# 开多线程 同样的时间 可以爬更多的网站 # 紧耦合 松耦合 ?(包一个包子 买一个包子)(包很多包子 买很多包子)
# 获得数据 生产者
# 处理数据 消费者
# 调节生产者的个数或者消费者的个数让程序的效率达到最平衡和最大化
# 解耦思想
import time
import random
# def producer(q): #爬虫
# for i in range(10):
# time.sleep(random.random())#爬虫的时间
# food = '泔水%s'%i
# print('%s 生产了 %s'%('taibai',food))
# q.put(food)
# # num = random.randint(1,100)
# # print('producer 生产了一个数据%s'%num,)
# q.put(food)
# def consumer(q,name):
# while True: # 处理数据
# food = q.get() # food = shiwu / None
# if not food : break
# time.sleep(random.uniform(1,2)) #处理数据再短也要处理一会
# print('%s 吃了 %s '%(name,food))
# num = q.get()
# print('消费者受到了一个%s'%num)
# 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) #传过去None 判断退出
# q.put(None) from multiprocessing import JoinableQueue,Process
# 放任务 取任务 #生产数据 放进来 计数器 加 1
# q.join() 阻塞 直到为零
#反回 一个消息 q.task_done def consumer(jq,name):
while True: # 处理数据
food = jq.get()
# if food : break
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()
c1 = Process(target=consumer,args = (jq,'alex'))
p1 = Process(target=producer,args = (jq,))
c1.daemon = True
c1.start()
p1.start()
p1.join() # consumer 所有数据消费完
# 队列join 结束
# producer 继承结束
# p1 进程阻塞结束
# 主进程的代码结束
# 守护进程结束 # 锁 同一时刻 同一段代码, 只能有一个进程来执行这段代码
#保证数据的安全
#多进程中,只有去操作一些,进程之间可以共享的数据资源的时候才需要枷锁
#lock = Lock()
#acquire() release
#with lock :
#Lock 互斥锁 # 队列
#IPC
#PUT
#GET
# 生产者消费者模型 基于队列把生产者和消费者数据的过程分开了 #补充:
#队列 是进程安全的(自带了锁) :一个人来取得时候不会有另个人来 ##AttributeError: module 'socket' has no attribute 'socket
#队列 基于什么实现的 文件家族的socket服务
# 基于文件家族的socket 服务实现的ipc不止一个,管道pipe
#pipe 会出现安全问题 没带锁
# 队列 = 管道+锁
#管道 是基于文件家族的socket 服务实现
from multiprocessing import Pipe
队列
锁
#acquire() 和 release()
#__author : 'liuyang'
#date : 2019/4/16 0016 上午 10:31
# 抢票 的 多台机器服务 (请求票的时候有可能信息修改了) #票的信息都存到一个大的
#
from multiprocessing import Process
import json
import time # 数据的安全性 一张票 被很多个人买了
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(0.2)
# if dic['count'] >= 1 :
# print('%s买到票了'%name)
# dic['count'] -= 1
# time.sleep(0.2)
# with open('ticket', encoding='utf-8')as f:
# # dic = json.load
# else:
# print('没了')
#十个人同时查票
def user(name):
#不涉及买 随便 并发
search_ticket(name)
# buy_ticket(name) # with 还会处理异常 前一个 出错了 以后的都可以释放 跳出异常
# 不等了
if __name__ == '__main__':
l = ['alex','b','c']
for name in l:
search_ticket(name)
# p = Process(target=search_ticket,args=(name,))
# p.start() # 1. 牺牲了效率 ,保证了数据安全 关闭了 多进程 异步 并发
# 在数据安全面前 效率不值一提 (和钱打交道的app都巨慢)
# 不涉及钱的 可以 牺牲一点安全
#2 用户就觉得 很慢 体验很差. # join() 是同步 加单道了 一个个执行 # 锁的应用场景 # # 内存里还有 子进程结束 子进程没了 变量 join 加入内存里了
锁
内容回顾
#__author : 'liuyang'
#date : 2019/4/16 0016 上午 10:31
# 抢票 的 多台机器服务 (请求票的时候有可能信息修改了) #票的信息都存到一个大的
#
from multiprocessing import Process
import json
import time # 数据的安全性 一张票 被很多个人买了
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(0.2)
# if dic['count'] >= 1 :
# print('%s买到票了'%name)
# dic['count'] -= 1
# time.sleep(0.2)
# with open('ticket', encoding='utf-8')as f:
# # dic = json.load
# else:
# print('没了')
#十个人同时查票
def user(name):
#不涉及买 随便 并发
search_ticket(name)
# buy_ticket(name) # with 还会处理异常 前一个 出错了 以后的都可以释放 跳出异常
# 不等了
if __name__ == '__main__':
l = ['alex','b','c']
for name in l:
search_ticket(name)
# p = Process(target=search_ticket,args=(name,))
# p.start() # 1. 牺牲了效率 ,保证了数据安全 关闭了 多进程 异步 并发
# 在数据安全面前 效率不值一提 (和钱打交道的app都巨慢)
# 不涉及钱的 可以 牺牲一点安全
#2 用户就觉得 很慢 体验很差. # join() 是同步 加单道了 一个个执行 # 锁的应用场景 # # 内存里还有 子进程结束 子进程没了 变量 join 加入内存里了
内容回顾到10.40
day33 锁和队列的更多相关文章
- 一个无锁消息队列引发的血案(六)——RingQueue(中) 休眠的艺术 [续]
目录 (一)起因 (二)混合自旋锁 (三)q3.h 与 RingBuffer (四)RingQueue(上) 自旋锁 (五)RingQueue(中) 休眠的艺术 (六)RingQueue(中) 休眠的 ...
- 一个无锁消息队列引发的血案(五)——RingQueue(中) 休眠的艺术
目录 (一)起因 (二)混合自旋锁 (三)q3.h 与 RingBuffer (四)RingQueue(上) 自旋锁 (五)RingQueue(中) 休眠的艺术 (六)RingQueue(中) 休眠的 ...
- 一个无锁消息队列引发的血案(四)——月:RingQueue(上) 自旋锁
目录 (一)起因 (二)混合自旋锁 (三)q3.h 与 RingBuffer (四)RingQueue(上) 自旋锁 (五)RingQueue(中) 休眠的艺术 (六)RingQueue(中) 休眠的 ...
- 一个无锁消息队列引发的血案(三)——地:q3.h 与 RingBuffer
目录 (一)起因 (二)混合自旋锁 (三)q3.h 与 RingBuffer (四)RingQueue(上) 自旋锁 (五)RingQueue(中) 休眠的艺术 (六)RingQueue(中) 休眠的 ...
- 铁乐学python_Day42_锁和队列
铁乐学python_Day42_锁和队列 例:多个线程抢占资源的情况 from threading import Thread import time def work(): global n tem ...
- 【数据结构】C++语言无锁环形队列的实现
无锁环形队列 1.Ring_Queue在payload前加入一个头,来表示当前节点的状态 2.当前节点的状态包括可以读.可以写.正在读.正在写 3.当读完成后将节点状态改为可以写,当写完成后将节点状态 ...
- Python并发编程03 /僵孤进程,孤儿进程、进程互斥锁,进程队列、进程之间的通信
Python并发编程03 /僵孤进程,孤儿进程.进程互斥锁,进程队列.进程之间的通信 目录 Python并发编程03 /僵孤进程,孤儿进程.进程互斥锁,进程队列.进程之间的通信 1. 僵尸进程/孤儿进 ...
- [并发编程 - socketserver模块实现并发、[进程查看父子进程pid、僵尸进程、孤儿进程、守护进程、互斥锁、队列、生产者消费者模型]
[并发编程 - socketserver模块实现并发.[进程查看父子进程pid.僵尸进程.孤儿进程.守护进程.互斥锁.队列.生产者消费者模型] socketserver模块实现并发 基于tcp的套接字 ...
- DPDK 无锁环形队列(Ring)详解
DPDK 无锁环形队列(Ring) 此篇文章主要用来学习和记录DPDK中无锁环形队列相关内容,结合了官方文档说明和源码中的实现,供大家交流和学习. Author : Toney Email : vip ...
随机推荐
- 1804.03235-Large scale distributed neural network training through online distillation.md
现有分布式模型训练的模式 分布式SGD 并行SGD: 大规模训练中,一次的最长时间取决于最慢的机器 异步SGD: 不同步的数据,有可能导致权重更新向着未知方向 并行多模型 :多个集群训练不同的模型,再 ...
- 解决ajax请求默认不支持重定向问题
1,Ajax默认是不支持重定向的,只局部刷新数据,不跳转页面. 2,后台代码处理: @RequestMapping("/updateCurrentUser") public Str ...
- 基于mysql创建库的报错解决小记mysql ERROR 1044 (42000): Access denied for user ''@'localhost' to database
mysql ERROR 1044 (42000): Access denied for user ''@'localhost' to database异常处理 1.找到find / -name my. ...
- .net 语音,视频等格式转换
最近在做微信公众号开发的时候遇到一个问题,就是微信接收到语音消息的格式为amr,在网页上通常不能直接播放,需要先转为mp3,于是找到了一个办法,使用ffmpeg.exe,网上可以搜一下ffmpeg.e ...
- pyparsing自定义解析规则
1.Word(token) 用于匹配由允许的字符集组成的单词,常见的错误是使用特定字符串Word("expr")匹配"expr" - L {alphas} 字 ...
- docker for mac
MacOS上通过docker部署 docker环境准备 1.访问这里安装好docker,需要注册账号才能下载dmg安装包:https://hub.docker.com/editions/communi ...
- 域名系统DNS以及跨域问题
域名到Ip地址解析是由分布在因特网上的许多域名服务器程序共同完成的.运行域名服务器程序的机器是域名服务器 域名到ip地址的解析过程: 当一个应用进程需要把主机名解析为ip地址时,该应用就调用解析程 ...
- Codeforces Round #491 (Div. 2)
Codeforces Round #491 (Div. 2) https://codeforces.com/contest/991 A #include<bits/stdc++.h> us ...
- python note 09 初识函数
1.函数 def my_len(): #自定义函数(相当于len) i = 0 for k in s: i += 1 print(i) print(my_len()) #输出None,因为没有返回值 ...
- 测H5
如果原文本自带样式,需要测在h5里能否正常展示