线程中put(None)和主函数中put(None)的区别和用法

'''
初试生产者消费者模型代码
分析:
对象含有生产者、队列、消费者
Queue队列模块,不适合传大文件,通常传一些消息。
'''
'''多生产者进程和多消费者进程'''
#导入模块
from multiprocessing import Process,Queue
import time
#生产者
def producers(q,name,food):
# 开始生产10个包子
for i in range(3):
print(f'{name}生产了{food}三丰牌{i}')
res=f'{food}{i}' #包子0-9当时卡了没有默写出来
#把生产者生产的一大堆包子打包成一个变量,然后直接put到队列的管子里(q.put(res)),等待消费者去get
#创建队列
q.put(res)
#队列结束标识
# q.put(None)
#消费者
def consumers(q,name):
while True:
# 把包子接收过来,创建接收队列
recive = q.get()
# 然后接收队列进行判断,如果recive是'我生产完毕了'的话,消费者就停止再继续吃包子了
if recive is None:
break
# time.sleep(3)
print(f'{name}吃掉了{recive}')
if __name__ == '__main__':
#创建队列对象
q=Queue()
p1 = Process(target=producers, args=(q, '张三丰', '狗不理包子')) # 此人生产者
p2 = Process(target=producers, args=(q, '郭靖', '降龙十八掌包子')) # 此人生产者
p3 = Process(target=producers, args=(q, '黄蓉', '打狗棒包子')) # 此人生产者
c1 = Process(target=consumers, args=(q, 'luzhaoshan')) # 此人消费者
c2 = Process(target=consumers, args=(q, 'xiaobai')) # 此人消费者
p1.start()
p2.start()
p3.start()
c1.start()
c2.start()
p1.join()
p2.join()
p3.join() #用join方法保证生产者生产完毕
q.put(None)
q.put(None) #几个消费者进程put几次
'''
问题01:
为什么会产生生产9个包子,吃掉了6个包子的问题?
解答:
put一次None,结束一个进程,总共put了3次None,
但是只接收了两个None,所以就会导致生产9个包子,
只吃掉了6个包子。
问题02:
为什么是两次None?
q.put(None)
q.put(None)
问题03:
问什么q.put(None)要写在这个地方?
问题04:
不注释第27行代码,执行结果为什么会吃掉6个包子呢?
运行结果如下:
张三丰生产了狗不理包子三丰牌0
张三丰生产了狗不理包子三丰牌1
张三丰生产了狗不理包子三丰牌2
郭靖生产了降龙十八掌包子三丰牌0
郭靖生产了降龙十八掌包子三丰牌1
郭靖生产了降龙十八掌包子三丰牌2
黄蓉生产了打狗棒包子三丰牌0
黄蓉生产了打狗棒包子三丰牌1
黄蓉生产了打狗棒包子三丰牌2
luzhaoshan吃掉了狗不理包子0
luzhaoshan吃掉了狗不理包子1
luzhaoshan吃掉了狗不理包子2
xiaobai吃掉了降龙十八掌包子0
xiaobai吃掉了降龙十八掌包子1
xiaobai吃掉了降龙十八掌包子2
'''
线程中put(None)和主函数中put(None)的区别和用法的更多相关文章
- Python中random模块在主函数中设置随机种子是否对于调用的函数中的随机值产生影响?
一个问题,加入我有一个工程文件,在main函数里面调用random模块,设置随机种子,主函数中的随机种子的设置是否会影响主函数所调用的函数中的随机值? 实际上这个问题非常重要,比如你在跑网络的时候,初 ...
- js闭包中的this(匿名函数中的this指向的是windows)
js闭包中的this(匿名函数中的this指向的是windows) 一.总结 1.普通函数中的this指向的是对象,匿名函数中的this指向的是windows,和全局变量一样 2.让匿名函数中的thi ...
- 从Win32程序中的主函数中获取命令行参数
在标准C或者Win32控制台程序的main函数中,它们都有两个参数:"argc" 和 "argv",如下所示: int main(int argc, char ...
- java的主函数中各个词的作用
主函数 public static void main(String[] args){} public: main主方法是由jvm(虚拟机)来调用,jvm实际也是一程序,为了保证jvm能在任何情况下调 ...
- HDU 2087 剪花布条(模式串在主串中出现的次数主串中子串不可重叠)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2087 题意:求模式串在主串中出现的次数,与模式串匹配的子串之间不可重叠. 思路:用kmp算法解决,在匹 ...
- js中的this和箭头函数中的this
一.ES6 允许使用"箭头"(=>)定义函数. // var f = v => v;// 上面的箭头函数等同于: // var f = function(v) {// ...
- 箭头函数中的this和普通函数中的this对比
ES6中新增了箭头函数这种语法,箭头函数以其简洁性和方便获取this的特性.下面来总结一下他们之间的区别: 普通函数下的this: 在普通函数中的this总是代表它的直接调用者,在默认情况下,this ...
- 在主函数中提示用户输入用户名和密码。另写一方法来判断用户输入是否正确。该方法分别返回一个bool类型的登录结果和和一个string类型的登录信息。如登录成功,返回true及“登录成功”,若登录失败则返回false及“用户名错误”或“密码错误”(使用out参数)
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- 编写一个void sort(int*x,int n)实现将x数组中的n个数据从大到小排序。n及数组元素在主函数中输入。将结果显示在屏幕上并输出到文件
#include<stdio.h> void sort(int*x,int n) { int i,j,k,t; for(i=0;i<n-1;i++) { k=i; for(j=i+1 ...
随机推荐
- keypress 和 blur 事件冲突的问题
需求:点击需求:点击添加标签,出来input框,内容输入完成后点击enter键和blur时都可以执行提交标签的效果,提交时对内容进行判断,执行完成后清除input内的内容.如下图 问题:内容输入完成后 ...
- python基础-面向对象编程之继承
面向对象编程之继承 继承的定义:是一种新建类的方式,新建的类称之为子类或派生类,被继承的父类称之为基类或超类 继承的作用:子类会""遗传"父类的属性,从而解决代码重用问题 ...
- Nginx 跨域代理
安装环境: win10 nginx-1.17.2 安装: 在写前端调用后台接口时,报了跨域的错误. 调试地址:http://localhost:5500/demo/encAjax.html 接口地址: ...
- uwsgi启动报错 chdir(): No such file or directory [core/uwsgi.c line 2591]
今天在使用 uwsgi --ini uwsgi.ini 命令时总说找不到我的项目路径,可是我的路径是绝对没有问题的 解决方法: 把你的uwgis.ini文件里的全部注释删除,再运行uwsgi 启动成功 ...
- 【Python3爬虫】网络小说更好看?十四万条书籍信息告诉你
一.前言简述 因为最近微信读书出了网页版,加上自己也在闲暇的时候看了两本书,不禁好奇什么样的书更受欢迎,哪位作者又更受读者喜欢呢?话不多说,爬一下就能有个了解了. 二.页面分析 首先打开微信读书:ht ...
- DJango中事务的使用
Django 中事务的使用 Django默认的事务行为 默认情况下,在Django中事务是自动提交的.当我们运行Django内置的模板修改函数时,例如调用model.save()或model.dele ...
- Eclipse官方下载步骤
今天整理Eclipse项目时,发现自己的IDE不能用了,不兼容自己的JDK,于是决定去官网下载一个适合的IDE,由于官网全部都是英文,所以不是太容易找到,于是就想着出一篇博客帮助以后的人更好的更快的下 ...
- 2019-2020-6 20199317《Linux内核原理与分析》第六周作业
第5章 系统调用的三层机制(下) 1 给MenuOS增加命令 首先进入LinuxKernel目录下,用rm -rf menu强制删除当前的menu目录,然后用git clone重新 ...
- IIS+PHP上传文件大小限制和上传时间限制,iis7和iis8上传文件大小限制和上传时间限制
先说IIS这边的配置 一:点击站点“管理”下的“配置编辑器”. 二:设 ...
- 第三章 学习Shader所需的数学基础(3)
@[TOC] 1. 顶点的坐标空间变换过程 我们知道,在渲染流水线中,一个顶点要经过多个坐标空间的变换才能最终被画在屏幕上.一个顶点最开始是在模型空间中定义的,它最后会被变换到屏幕空间中,得到真正的屏 ...