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

今天小編就爲大家分享一篇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學習扣qun:774711191 ,看看前輩們是如何學習的!從基礎的python腳本到web開發、爬蟲、django、數據挖掘等【PDF,實戰源碼】,零基礎到項目實戰的資料都有整理。送給每一位python的小夥伴!每天都有大牛定時講解Python技術,分享一些學習的方法和需要注意的小細節,點擊加入我們的 python學習者聚集地
以上這篇python 多線程中子線程和主線程相互通信方法就是小編分享給大家的全部內容了

發佈了51 篇原創文章 · 獲贊 17 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章