2021-7-21python学习日志

本文介绍了Python中进程间数据的隔离性,通过示例展示了如何使用`multiprocessing`模块的Queue来解决这个问题。接着,详细讲解了生产者消费者模型的四种实现方式,包括数据同步和不同数量的生产者与消费者情况。这些例子演示了如何在多进程中共享数据和协调任务执行。
摘要由CSDN通过智能技术生成

今日内容概要

	1. 进程间数据是隔离的
	2. Queue => 队列
	3. 生产者消费者模型

今日内容详情

  • 进程间数据是隔离的

    	from multiprocessing import Process
    	def task():
    	    global n
    	    n = 100
    	    print('xxx', n)
    	if __name__ == '__main__':
    	    p = Process(target=task)
    	    p.start()
    	    n = 10
    	    print('zzz', n)
    
    
  • 解决进程间隔离问题

    	import os
    	from multiprocessing import  Queue,Process
    	
    	def task(queue):
    	    print('这个进程id:%s开始放数据了'%os.getpid())
    	    queue.put('wkj XXX')
    	    print('这个进程id:%s放完了'%os.getpid())
    	
    	if __name__ == '__main__':
    	    q=Queue(3)
    	    p=Process(target=task,args=(q,))
    	    p.start()
    	    print('zjc')
    	    res=q.get()
    	    print('主进程取值',res)
    
  • 多进程存储数据

    	import os
    	from multiprocessing import  Queue,Process
    	def get_task(queue):
    	    print('%s:%s'%(os.getpid(),queue.get()))
    	def put_task(queue):
    	    queue.put('%s开始放数据了'%os.getpid())
    
    	if __name__ == '__main__':
    	    q=Queue(3)
    	    p=Process(target=put_task,args=(q,))
    	    p.start()
    	    p1 = Process(target=put_task, args=(q,))
    	    p1.start()
    	    p2 = Process(target=get_task, args=(q,))
    	    p2.start()
    	    p3 = Process(target=get_task, args=(q,))
    	    p3.start()
    
    
  • 生产者消费者模型

    	import os
    	import time
    	import random
    	from multiprocessing import Process,Queue
    	#
    	# 版本一
    	# 生产者
    	def producer(queue):
    	    # 把数据全部放在Queue
    	    for i in range(10):
    	        data='这个进程id:%s蒸了第%s个包子'%(os.getpid(),i)
    	        print(data)
    	        time.sleep(random.randint(1,3))
    	        queue.put('%s个包子'%i)
    	def consumer(queue):
    	    while True:
    	        res=queue.get()
    	        data = '这个进程id:%s吃了%s' % (os.getpid(), res)
    	        print(data)
    	
    	if __name__ == '__main__':
    	    q=Queue(3)
    	    p=Process(target=producer,args=(q,))
    	    p.start()
    	    p1=Process(target=consumer,args=(q,))
    	    p1.start()
    	    
    	# 版本二
    	def producer(queue):
    	    # 把数据全部放在Queue
    	    for i in range(10):
    	        data = '这个进程id:%s蒸了第%s个包子' % (os.getpid(), i)
    	        print(data)
    	        time.sleep(random.randint(1, 3))
    	        queue.put('%s个包子' % i)
    	    queue.put(None)
    	
    	def consumer(queue):
    	    while True:
    	        res = queue.get()
    	        if not res:break
    	        data = '这个进程id:%s吃了%s' % (os.getpid(), res)
    	        print(data)
    	
    	
    	if __name__ == '__main__':
    	    q = Queue(3)
    	    p = Process(target=producer, args=(q,))
    	    p.start()
    	    p1 = Process(target=consumer, args=(q,))
    	    p1.start()
    	    
    	# 版本三
    	def producer(queue):
    	    # 把数据全部放在Queue
    	    for i in range(10):
    	        data = '这个进程id:%s蒸了第%s个包子' % (os.getpid(), i)
    	        print(data)
    	        time.sleep(random.randint(1,2))
    	        queue.put('%s个包子' % i)
    	
    	
    	def consumer(queue):
    	    while True:
    	        res = queue.get()
    	        if not res: break
    	        data = '这个进程id:%s吃了%s' % (os.getpid(), res)
    	        print(data)
    	
    	
    	if __name__ == '__main__':
    	    q = Queue(3)
    	    p = Process(target=producer, args=(q,))
    	    p.start()
    	    p1 = Process(target=consumer, args=(q,))
    	    p1.start()
    	    # time.sleep(20)
    	    p.join()
    	    q.put(None)# None放在这里不合适,原因是主进程直接执行put None
    	
    	# 版本四 生产者大于消费者
    	def producer(queue,food):
    	    # 把数据全部放在Queue
    	    for i in range(10):
    	        data = '这个进程id:%s生产第%s个%s' % (os.getpid(), i,food)
    	        print(data)
    	        time.sleep(random.randint(1, 2))
    	        queue.put('第%s个%s' % (i,food))
    	
    	
    	def consumer(queue,name):
    	    while True:
    	        res = queue.get()
    	        if not res: break
    	        data = '这个消费者%s吃了%s' % (name, res)
    	        print(data)
    	
    	
    	if __name__ == '__main__':
    	    q = Queue(3)
    	    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,'wkj1'))
    	    p5 = Process(target=consumer, args=(q,'wkj2'))
    	
    	    p4.start()
    	    p5.start()
    	
    	    p1.join()
    	    p2.join()
    	    p3.join()
    	
    	    q.put(None)
    	    q.put(None)
    	    q.put(None)
    
    	# 版本五 生产者小于消费者
    	def producer(queue, food):
    	    # 把数据全部放在Queue
    	    for i in range(10):
    	        data = '这个进程id:%s生产第%s个%s' % (os.getpid(), i, food)
    	        print(data)
    	        time.sleep(random.randint(1, 2))
    	        queue.put('第%s个%s' % (i, food))
    	
    	
    	def consumer(queue, name):
    	    while True:
    	        try:
    	            res = queue.get(timeout=5)
    	            if not res: break
    	            data = '这个消费者%s吃了%s' % (name, res)
    	            print(data)
    	        except Exception as e:
    	            print(e)
    	            break
    	
    	
    	if __name__ == '__main__':
    	    q = Queue(3)
    	    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, 'wkj1'))
    	    p5 = Process(target=consumer, args=(q, 'wkj2'))
    	    p6 = Process(target=consumer, args=(q, 'wkj3'))
    	    p7 = Process(target=consumer, args=(q, 'wkj4'))
    	    p4.start()
    	    p5.start()
    	    p6.start()
    	    p7.start()
    	
    	    p1.join()
    	    p2.join()
    	    p3.join()
    	
    	    q.put(None)
    	    q.put(None)
    	    q.put(None)
    
    
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值