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的装饰器的运用
May 05 Python
python 远程统计文件代码分享
May 14 Python
Python求两个文本文件以行为单位的交集、并集与差集的方法
Jun 17 Python
一个基于flask的web应用诞生 bootstrap框架美化(3)
Apr 11 Python
使用实现XlsxWriter创建Excel文件并编辑
May 04 Python
pandas取出重复数据的方法
Jul 04 Python
Python实现直播推流效果
Nov 26 Python
利用python在excel中画图的实现方法
Mar 17 Python
Python Tkinter图形工具使用方法及实例解析
Jun 15 Python
使用Python爬取小姐姐图片(beautifulsoup法)
Feb 11 Python
python解包用法详解
Feb 17 Python
python爬虫线程池案例详解(梨视频短视频爬取)
Feb 20 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
预告映像公开!第1章续篇剧场版动画《Princess Principal Crown Handler》4月10日上映!
2020/03/06 日漫
php生成固定长度纯数字编码的方法
2015/07/09 PHP
php+redis实现多台服务器内网存储session并读取示例
2017/01/12 PHP
PHP使用PDO调用mssql存储过程的方法示例
2017/10/07 PHP
Mozilla中显示textarea中选择的文字
2006/09/07 Javascript
利用javascript中的call实现继承
2007/01/22 Javascript
判断是否安装flash player及当前版本的JS代码
2013/08/08 Javascript
JavaScript实现弹出DIV层同时页面背景渐变成半透明效果
2016/03/25 Javascript
使用vue.js2.0 + ElementUI开发后台管理系统详细教程(一)
2017/01/21 Javascript
jQuery tip提示插件(实例分享)
2017/04/28 jQuery
AngularJS使用ng-class动态增减class样式的方法示例
2017/05/18 Javascript
vue2 中如何实现动态表单增删改查实例
2017/06/09 Javascript
protractor的安装与基本使用教程
2017/07/07 Javascript
Mobile Web开发基础之四--处理手机设备的横竖屏问题
2017/08/11 Javascript
axios 处理 302 状态码的解决方法
2018/04/10 Javascript
js实现左右轮播图
2020/01/09 Javascript
基于vue-draggable 实现三级拖动排序效果
2020/01/10 Javascript
在Python的Flask框架中使用日期和时间的教程
2015/04/21 Python
Python实现基于多线程、多用户的FTP服务器与客户端功能完整实例
2017/08/18 Python
遗传算法之Python实现代码
2017/10/10 Python
Python-OpenCV基本操作方法详解
2018/04/02 Python
使用Python快速搭建HTTP服务和文件共享服务的实例讲解
2018/06/04 Python
对python while循环和双重循环的实例详解
2019/08/23 Python
Python3 无重复字符的最长子串的实现
2019/10/08 Python
安装2019Pycharm最新版本的教程详解
2019/10/22 Python
CSS3制作轮播图的一种方法
2019/11/11 HTML / CSS
经典c++面试题五
2014/12/17 面试题
汉语专业应届生求职信
2013/10/01 职场文书
工商管理本科毕业生求职信范文
2013/10/05 职场文书
高中体育教学反思
2014/01/24 职场文书
写给领导的感谢信
2015/01/22 职场文书
幼儿园圣诞节活动总结
2015/05/06 职场文书
一文读懂navicat for mysql基础知识
2021/05/31 MySQL
详解JVM系列之内存模型
2021/06/10 Javascript
win10清理dns缓存
2022/04/19 数码科技
Android Studio实现简易进制转换计算器
2022/05/20 Java/Android