python 多线程中子线程和主线程相互通信方法


Posted in Python onNovember 09, 2018

需求:主线程开启了多个线程去干活,每个线程需要完成的时间不同,但是在干完活以后都要通知给主线程

下面上代码:

#!/usr/bin/python
# coding:utf8
'''
多线程和queue配合使用,实现子线程和主线程相互通信的例子
'''
import threading
 
__author__ = "Kenny.Li"
 
import Queue
import time
import random
 
q = Queue.Queue()
 
 
class MyThread(threading.Thread):
 def __init__(self, q, t, j):
  super(MyThread, self).__init__()
  self.q = q
  self.t = t
  self.j = j
 
 def run(self):
  time.sleep(self.j)
  self.q.put(u"我是第%d个线程,我睡眠了%d秒,当前时间是%s" % (self.t, self.j, time.ctime()))
 
 
count = 0
threads = []
for i in xrange(15):
 j = random.randint(1, 8)
 threads.append(MyThread(q, i, j))
for mt in threads:
 mt.start()
print "start time: ", time.ctime()
while True:
 if not q.empty():
  print q.get()
  count += 1
 if count == 15:
  break

下面对以上代码进行解释:

1,q 是实例化了的队列对象,具有FIFO性。首先定义一个自己的线程类,重写run方法。注意在构造方法中传入q队列,用于接收每个线程需要返回的消息

2,第26行,通过q.put()方法,将每个子线程要返回给主线程的消息,存到队列中。

3,从第31行开始,生成15个子线程,加入到线程组里,每个线程随机睡眠1-8秒(模拟每个线程干活时间的长短不同)

4,第34-35行,循环开启所有子线程

5,第36行,打印开始时间

6,通过一个while循环,当q队列中不为空时,通过q.get()方法,循环读取队列q中的消息,每次计数器加一,当计数器到15时,证明所有子线程的消息都已经拿到了,此时循环停止。

以上这篇python 多线程中子线程和主线程相互通信方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
简单上手Python中装饰器的使用
Jul 12 Python
python实现倒计时小工具
Jul 29 Python
Python搭建代理IP池实现检测IP的方法
Oct 27 Python
Python使用Turtle库绘制一棵西兰花
Nov 23 Python
PIL包中Image模块的convert()函数的具体使用
Feb 26 Python
python opencv实现图片缺陷检测(讲解直方图以及相关系数对比法)
Apr 07 Python
Python如何输出整数
Jun 07 Python
python 字符串的驻留机制及优缺点
Jun 19 Python
宝塔面板成功部署Django项目流程(图文)
Jun 22 Python
matplotlib 画双轴子图无法显示x轴的解决方法
Jul 27 Python
python创建文本文件的简单方法
Aug 30 Python
Python爬虫之Selenium警告框(弹窗)处理
Dec 04 Python
Python文件循环写入行时防止覆盖的解决方法
Nov 09 #Python
对python cv2批量灰度图片并保存的实例讲解
Nov 09 #Python
python进阶之多线程对同一个全局变量的处理方法
Nov 09 #Python
python 多线程将大文件分开下载后在合并的实例
Nov 09 #Python
python 利用for循环 保存多个图像或者文件的实例
Nov 09 #Python
浅谈python写入大量文件的问题
Nov 09 #Python
启动Atom并运行python文件的步骤
Nov 09 #Python
You might like
PHP个人网站架设连环讲(四)
2006/10/09 PHP
PHP数据缓存技术
2007/02/14 PHP
PHP反射类ReflectionClass和ReflectionObject的使用方法
2013/11/13 PHP
如何打开php的gd2库
2017/02/09 PHP
php创建图像具体步骤
2017/03/13 PHP
详解PHP版本兼容之openssl调用参数
2018/07/25 PHP
php判断电子邮件是否正确方法
2018/12/04 PHP
不同浏览器的怪癖小结
2010/07/11 Javascript
js实现网站首页图片滚动显示
2013/02/04 Javascript
IE6下拉框图层问题探讨及解决
2014/01/03 Javascript
jquery操作cookie插件分享
2014/01/14 Javascript
用javascript实现自动输出网页文本
2015/07/30 Javascript
js实现select下拉框菜单
2015/12/08 Javascript
JavaScript中eval函数的问题
2016/01/31 Javascript
Extjs4.0 ComboBox如何实现三级联动
2016/05/11 Javascript
微信小程序 UI布局常用技巧整理总结
2016/12/05 Javascript
Angular的自定义指令以及实例
2016/12/26 Javascript
Cookbook组件形式:优化 Vue 组件的运行时性能
2018/11/25 Javascript
ES6 Proxy实现Vue的变化检测问题
2019/06/11 Javascript
[05:42]DOTA2英雄梦之声_第10期_蝙蝠骑士
2014/06/21 DOTA
python实现支持目录FTP上传下载文件的方法
2015/06/03 Python
python 字符串转列表 list 出现\ufeff的解决方法
2017/06/22 Python
Django框架的使用教程路由请求响应的方法
2018/07/03 Python
Python后台管理员管理前台会员信息的讲解
2019/01/28 Python
python matplotlib库绘制散点图例题解析
2019/08/10 Python
Python简易计算器制作方法代码详解
2019/10/31 Python
Python实现代码块儿折叠
2020/04/15 Python
python中如何打包用户自定义模块
2020/09/23 Python
利用HTML5中Geolocation获取地理位置调用Google Map API在Google Map上定位
2013/01/23 HTML / CSS
PyQt QMainWindow的使用示例
2021/03/24 Python
个人生活学习自我评价范文
2013/11/26 职场文书
记帐员岗位责任制
2014/02/08 职场文书
初三语文教学反思
2016/03/03 职场文书
python 开心网和豆瓣日记爬取的小爬虫
2021/05/29 Python
vue中this.$http.post()跨域和请求参数丢失的解决
2022/04/08 Vue.js
Vue3实现简易音乐播放器组件
2022/08/14 Vue.js