day29 进程锁Queue队列
进程锁
from multiprocessing import Process,Lock
import os,time
def task(i,lock):
lock.acquire()#上锁
print('进程进来了序号为:%s id号为:%s'%(i,os.getpid()))
print('进程出去了序号为:%s id号为:%s'%(i,os.getpid()))
time.sleep(2)
lock.release()#解锁
if __name__ == '__main__':
lock=Lock()
for i in range(5):
p=Process(target=task,args=(i,loc k))
p.start()
print('main id为:%s' % p.pid)
锁就是并发变成串行,牺牲效率提高安全性
进程间数据隔离
from multiprocessing import Process
x=666
def task():
global x
x=999
print('task:',x)
if __name__ == '__main__':
# task()#调用方法
# print('main:',x)#x被改变了为999 当前在一个进程
p=Process(target=task)#实例化一个新进程
p.start()#启动一个新进程
print('main:', x)#main进程和p进程是两个不搭边的进程
Queue队列
from multiprocessing import Queue
if __name__ == '__main__':
q=Queue(2) #一个空队列对象 ,只能放进去两个数据,如果有三个数据要放进去,两个先放进去,第三个等着,什么时候放进去的那两个被取走一个,他才会放进去
q.put('我的天哪')
q.put('我的地哪')
# q.put('我的神哪',block=False)#放不进去数据立即报错 queue.Full
# q.put('我的神哪',timeout=2) #数据放不进去等两秒,如果还放不进去 报错queue.Full
# q.put_nowait('我的肾哪')#相当于加一个block 如果放不进去立即报错
# print(q.get()) #取过值 队列就不存在这个值了
# print(q.get()) #取过值 队列就不存在这个值了
# print(q.get(block=False))#获取不到数据立即报错 _queue.Empty
# print(q.get(timeout=2))#等两秒获取不到数据立即报错 _queue.Empty
# print(q.get_nowait())#相当于加一个block 如果查不到立即报错
# print(q.qsize())#返回队列的数量,返回队列目前有几个数据,如果上面get取过就会相应减少 不可靠的因为会很多进程操作可能
# print(q.empty())#判断队列是不是空 空是True 有数据是False,如果上面get取过就会相应减少 不可靠的因为会很多进程操作可能
# print(q.full())#判断队列满没满,满返回True,不满返回False 如果上面get取过就会相应减少 不可靠的因为会很多进程操作可能
'''
kafka(主流)
rabbitmq(主流)
httpsqs(不经常用)
队列挤压,队列有很多数据取不出来,后面的越来越多,没人取数据
'''
解决进程间数据隔离问题
from multiprocessing import Process,Queue
def task(queqe):#传进来个队列,往队列里添加数据
queqe.put('handsome')
if __name__ == '__main__':
q = Queue(2)
p=Process(target=task,args=(q,))
p.start()
print(q.get())#从队列获取数据
生产者消费者模型代码演示******************************************************************
from multiprocessing import Process,Queue
import os,time
#版本1
# def producer(queue):
# for i in range(10):
# data=('生产者%s 生产了第%s 个包子' %(os.getpid(),i))
#
# queue.put(data)
#
#
# def consumer(queue):
# while True:
# time.sleep(1)
# print(queue.get())
#
# if __name__ == '__main__':
# q=Queue()
# p=Process(target=producer,args=(q,))
# p.start()
#
# p1=Process(target=consumer,args=(q,))
# p1.start()
#版本2
# def producer(queue):
# for i in range(10):
# data=('生产者%s 生产了第%s 个包子' %(os.getpid(),i))
#
# queue.put(data)
# queue.put(None)
#
# def consumer(queue):
# while True:
#
# data=queue.get()
# if not data : break
# time.sleep(1)
#
# print(data)
#
#
# if __name__ == '__main__':
# q=Queue()
# p=Process(target=producer,args=(q,))
# p.start()
#
# p1=Process(target=consumer,args=(q,))
# p1.start()
#版本3
# def producer(queue):
# for i in range(10):
# data=('生产者%s 生产了第%s 个包子' %(os.getpid(),i))
# queue.put(data)
# # queue.put(None)
#
# def consumer(queue):
# while True:
# data=queue.get()
# if not data : break
# time.sleep(1)
#
# print(data)
#
#
# if __name__ == '__main__':
# q=Queue()
# p=Process(target=producer,args=(q,))
# p.start()
#
# p1=Process(target=consumer,args=(q,))
# p1.start()
#
# q.put(None)#q.put(None) 不能这么写 ,因为上面只是通知了操作系统启动进程,然后队列直接加进去一个None然后消费者取值时候第一个None退出
# print('end>>>>>>')
#版本四
# def producer(queue):
# for i in range(10):
# data=('生产者%s 生产了第%s 个包子' %(os.getpid(),i))
# queue.put(data)
# # queue.put(None)
#
# def consumer(queue):
# while True:
# data=queue.get()
# if not data : break
# time.sleep(1)
#
# print(data)
#
#
# if __name__ == '__main__':
# q=Queue()
# p=Process(target=producer,args=(q,))
# p.start()
#
# p1=Process(target=consumer,args=(q,))
# p1.start()
#
# p.join()
# q.put(None)
# # p1.join() #其实可以不用加
# print('end>>>>>>')
# #版本5 多用户,生产者多,消费者少
# def producer(queue,food):
# for i in range(10):
# data=('生产者%s 生产了第%s个%s:' %(os.getpid(),i,food))
# queue.put(data)
#
#
# def consumer(queue):
# while True:
# data=queue.get()
# if not data : break
# time.sleep(0.2)
# print(data)
#
#
# if __name__ == '__main__':
# q=Queue()
# p1=Process(target=producer,args=(q,'鸡腿'))
# p2=Process(target=producer,args=(q,'大辣条'))
# p3=Process(target=producer,args=(q,'汉堡包'))
# p1.start()
# p2.start()
# p3.start()
#
# p4=Process(target=consumer,args=(q,))
# p5=Process(target=consumer,args=(q,))
# p4.start()
# p5.start()
#
# p1.join()
# p2.join()
# p3.join()
# q.put(None)
# q.put(None)
# print('end>>>>>>')
#版本6 多用户,消费者多,生产者少
def producer(queue,food):
for i in range(10):
data=('生产者%s 生产了第%s个%s:' %(os.getpid(),i,food))
queue.put('第%s个%s'%(i,food))
def consumer(queue,name):
while True:
try:
data=queue.get(timeout=2)
if not data : break
time.sleep(0.2)
print('消费者:%s消费了%s--'%(name,data))
except Exception as e:
print(e)
break
if __name__ == '__main__':
q=Queue()
p1=Process(target=producer,args=(q,'鸡腿'))
p2=Process(target=producer,args=(q,'大辣条'))
p3=Process(target=producer,args=(q,'汉堡包'))
p1.start()
p2.start()
p3.start()
p4=Process(target=consumer,args=(q,'李白'))
p5=Process(target=consumer,args=(q,'杜甫'))
p6=Process(target=consumer,args=(q,'贝吉塔'))
p7=Process(target=consumer,args=(q,'特兰克斯'))
p4.start()
p5.start()
p6.start()
p7.start()