1 """

2 线程通信的生产者与消费者3 python的queue模块中提供了同步的线程安全的队列类,都具有原子性,实现线程间的同步4 Queue (FIFO: fist in fist out)5 LifoQueue (LIFO: last in fist out)6 PriorityQueue (优先级队列)7

8 task_done():9 作用是在使用join()的时候,当queue中所有的项目都被取出,且每个项目取出后都使用了task_done(),那么就可以释放join()阻塞10 系统解释如下:11 用于消费者,每次get()以后,使用task_done() 是告诉队列正在处理的get任务完成12 如果join()当前处于阻塞状态,那么当处理完所有项时它将继续运行(这意味着对于已经放入队列的每个项都接收到task_done()调用)。13 如果调用的次数超过在队列中放置的项的次数,则引发ValueError错误。14

15 如果不需要join()的时候也可以不使用task_done()16

17

18 """

19 importqueue20 importthreading21 importtime22 importrandom23

24 q = queue.Queue(10)25

26

27 defproduce():28 i =029 while i < 10:30 num = random.randint(1, 100)31 q.put("生产者生产出数据:%d" %num)32 print("生产者生产出数据:%d" %num)33 time.sleep(0.2)34 i += 1

35 print("生产结束")36

37

38 defconsume():39 whileTrue:40 time.sleep(0.3)41 ifq.empty():42 break

43 item =q.get()44 print("消费者取出:", item)45 q.task_done()46

47 print("消费者结束")48

49

50 if __name__ == '__main__':51

52 #创建生产者

53 t1 = threading.Thread(target=produce, name="生产者")54 t1.start()55 time.sleep(0.1)56

57 #创建消费者

58 t2 = threading.Thread(target=consume, name="消费者")59 t2.start()60 q.join()61

62 print("over")63

64

65 #from threading import Thread

66 #import time

67 #import random

68 #from queue import Queue

69 #from collections import deque

70 #from datetime import datetime

71 #72 ## 创建队列,设置队列最大数限制为3个

73 #queue = Queue(3)

74 #75 #76 ## 生产者线程

77 #class Pro_Thread(Thread):

78 #def run(self):

79 ## 原材料准备,等待被生产,这里使用的是双向队列

80 #tasks = deque([1, 2, 3, 4, 5, 6, 7, 8])

81 #global queue

82 #while True:

83 #try:

84 ## 从原材料左边开始生产,如果tasks中没有元素,调用popleft()则会抛出错误

85 #task = tasks.popleft()

86 #queue.put(task)

87 #print(datetime.now(), "生产", task, "现在队列数:", queue.qsize())

88 #89 ## 休眠随机时间

90 #time.sleep(0.5)

91 ## 如果原材料被生产完,生产线程跳出循环

92 #except IndexError:

93 #print("原材料已被生产完毕")

94 #break

95 #print("生产完毕")

96 #97 #98 ## 消费者线程

99 #class Con_Thread(Thread):

100 #def run(self):

101 #global queue

102 #while True:

103 #if not queue.empty():

104 ## 通过get(),这里已经将队列减去了1

105 #task = queue.get()

106 #time.sleep(2)

107 ## 发出完成的信号,不发的话,join会永远阻塞,程序不会停止

108 #queue.task_done()

109 #print(datetime.now(), "消费", task)

110 #else:

111 #break

112 #print("消费完毕")

113 #114 #115 ## r入口方法,主线程

116 #def main():

117 #Pro_1 = Pro_Thread()

118 ## 启动线程

119 #Pro_1.start()

120 ## 这里休眠一秒钟,等到队列有值,否则队列创建时是空的,主线程直接就结束了,实验失败,造成误导

121 #time.sleep(1)

122 #for i in range(2):

123 #Con_i = Con_Thread()

124 ## 启动线程

125 #Con_i.start()

126 #global queue

127 ## 接收信号,主线程在这里等待队列被处理完毕后再做下一步

128 #queue.join()

129 ## 给个标示,表示主线程已经结束

130 #print("主线程结束")

131 #132 #133 #if __name__ == '__main__':

134 #main()

python 异步 生产者 消费者_python 线程通信 生产者与消费者相关推荐

  1. java的知识点34——线程通信 || 生产者与消费者问题

    线程通信 应用场景:生产者和消费者问题 • 假设仓库中只能存放一件产品,生产者将生产出来的产品放入仓库,消费者将仓库中产品取走消费 • 如果仓库中没有产品,则生产者将产品放入仓库,否则停止生产并等待, ...

  2. python多线程队列处理_Python线程和队列使用的一点思考

    Python线程和队列使用的一点思考 1. 斗哥采访环节请问为什么要使用线程? 答:为了提高程序速度,代码效率呀. 请问为什么要使用队列? 答:个人认为队列可以保证线程安全,实现线程间的同步,比较稳. ...

  3. python中event_Python Event实现线程通信

    Event是一种非常简单的线程通信机制,一个线程发出一个 Event,另一个线程可通过该 Event 被触发. Event 本身管理一个内部旗标,程序可以通过 Event 的 set() 方法将该旗标 ...

  4. python多线程数据交互_python 多线程 通信

    一篇文章搞定Python多进程(全) 公众号:pythonislover 前面写了三篇关于python多线程的文章,大概概况了多线程使用中的方法,文章链接如下: 一篇文章搞懂Python多线程简单实现 ...

  5. python异步socket接收_Python简易聊天工具-基于异步Socket通信

    #-*- coding: UTF-8 -*- from asyncore import dispatcher from asynchat import async_chat import asynco ...

  6. python异步io 队列_python 学习笔记九 队列,异步IO

    queue (队列) 队列是为线程安全使用的. 1.先入先出 import queue #测试定义类传入队列class Foo(object): def __init__(self,n): self. ...

  7. 浅谈python异步IO,同步IO,线程与进程~

    主线程下的线程之间是可以通信的,但是父进程下的子进程之间不能主动通信,但是子进程想要实现通信也是可以的,可以选择折中的方法来实现,比如multiprocessing.Queue,用法与线程中的queu ...

  8. python异步多线程框架_Python网络编程中的服务器架构(负载均衡、单线程、多线程和同步、异步等)。...

    这篇文章主要介绍服务器架构. 网络服务需要面对两个挑战.第一个问题是核心挑战,要编写出能够正确处理请求并构造合适响应的代码. 第二个挑战是如何将网络代码部署到随系统自动启动的Windows服务或者是U ...

  9. python异步和多线程_Python 异步 IO(asyncio)、多进程、多线程性能对比

    IO 密集型应用 IO 密集型应用CPU等待IO时间远大于CPU 自身运行时间,太浪费:常见的 IO 密集型业务包括:浏览器交互.磁盘请求.网络爬虫.数据库请求等 image.png Python 世 ...

最新文章

  1. 一种用于360度全景视频超分的单帧多帧联合网络
  2. 透视鹏程.盘古:首个2000亿参数中文大模型是怎样炼成的?
  3. c++ TCP keepalive 使用
  4. 向前欧拉公式例题_干货丨阅读理解答题万能公式,语文考试高分秘籍!
  5. pyqt5 不报错退出_最新版本Python图形化开发环境Anaconda(Python3.7) +PyQT5+Eric6
  6. Ubuntu 文件文件夹查看权限和设置权限
  7. 直播APP源码网络基础部分处理:
  8. 专访邱锡鹏:人工智能开源社区的「先行者」
  9. 使用Arduino,蓝牙和Android app的开源爬墙机器人
  10. macOS用的是linux系统吗
  11. 我怎梦想是计算机科学家,我的梦想是当一名科学家作文
  12. NGINX源码之:ngx_bufchain
  13. 【短信发送】实现腾讯云发送短信功能--工具类和SpringBoot配置两种方法实现
  14. matlab中工作空间的作用,MATLAB的工作空间
  15. 如何打开被关闭的任务管理器
  16. 论文详读:Beyond Brightening Low-light Images (Kind++)
  17. getchar()和gets()
  18. 杭州 职称 计算机免试,浙职称评审政策调整外语计算机免考年限有变动
  19. CCPC-Wannafly Summer Camp 2019 全记录
  20. Raspuberry PI3 RPi.GPIO 官方文档翻译

热门文章

  1. git命令下载项目,上传android项目到github步骤,以及取消项目关联Git,设置git忽略文件
  2. 判断浏览器是否为手机端 is mobile
  3. centos yum 安装python3.6+pip
  4. 详解spring boot mybatis全注解化
  5. mysql的中文乱码url,MySQL 中文显示乱码
  6. TCP协议下 Socket 与 ServerSocket
  7. 的run窗口不显示_「玩转deepin」如何安装VirtualBox增强功能使得deepin全屏显示?...
  8. BUUOJ reverse SimpleRev (爆破)
  9. VUE初始化一个项目
  10. 安防摄像头Onvif、RTSP、GB28181转web无插件直播卡顿分析