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

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

下面上代码:

#!/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)