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 ...
随机推荐
- Ubuntu16.04 导入tensorflow报错
错误1:Traceback (most recent call last): File "/home/lwc/anaconda3/lib/python3.6/site-packages/t ...
- <mvc:resources mapping="/xxx/**" location="/xxx/"/>无效,可能和Controller的URL模式有关
某项目webapp下有子目录res,其中有img.css.js等存放静态资源的文件夹. 在定义了dispacher-servlet的<url-pattern>/</url-patte ...
- 20175213 2018-2019-2 《Java程序设计》第8周学习总结
教材学习内容总结 1:泛型主要目的是建立具有类型安全的集合框架,如链表,散列映射等数据结构. 泛型类的声明: class People<E> People是泛型类的名称,E是其中泛型,E可 ...
- Spring 初学笔记
Spring 初学笔记: https://blog.csdn.net/weixin_35909255/article/category/7470388
- Java框架spring 学习笔记(七):Spring相关概念
Spring是开源.轻量级.一站式框架. Spring核心主要两部分 aop:面向切面编程,扩展功能不是修改源代码实现. ioc:控制反转,把对象的创建交给Spring进行配置,比如一个类,在类里面有 ...
- windows下git 同步数据到github的常见问题
常用排错方法: 1,查看连接是否正常. 2,push数据有时会报错,这是由于远程repository和我本地的repository冲突造成. 解决方法: 1.使用强制push的方法: git push ...
- Unity PRO 2018.3.3f1 for MAC+完美pojie补丁!!!
Unity Pro 2018 for mac是游戏开发必备的软件之一,Unity mac 版主要用于创建2D和3D跨平台游戏,比如三维视频游戏.实时三维动画.建筑可视化等类型,最新版本的Unity P ...
- 生成式对抗网络(GAN)实战——书法字体生成练习赛
https://www.tinymind.cn/competitions/ai 生成式对抗网络(GAN)是近年来大热的深度学习模型. 目前GAN最常使用的场景就是图像生成,作为一种优秀的生成式模型,G ...
- mysql学习3:mysql之my.cnf详解
mysql之my.cnf详解 本文转自:https://www.cnblogs.com/panwenbin-logs/p/8360703.html 以下是 my.cnf 配置文件参数解释: #*** ...
- python使用requests库爬取网页的小实例:爬取京东网页
爬取京东网页的全代码: #爬取京东页面的全代码 import requests url="https://item.jd.com/2967929.html" try: r=requ ...