1. 程式人生 > >python 多線程 及多線程通信

python 多線程 及多線程通信

線程 false 簡單 def 判斷 end targe tar 括號

1、簡單的多線程例子

import threading,time
def b_fun(i):
print "____________b_fun start"
time.sleep(7)
print "________________b_fun end"

def a_fun():
print "__________a_fun start"
t = threading.Thread(target=b_fun, args=(1,))
# t.setDaemon(True) #setDaemon()設置為False和沒有這句話一個意思,設置為True,就是主線程a_fun函數不登t這個子線程了,a運行完,不管t運行完沒有,a和t都結束,且setDaemon必須放在start()前面
    t.start()
print "__________1",
# t.join(3) #join()小括號中設置3的意思是,主線程a_fun函數運行到這的時候,等子線程t 3秒鐘,三秒鐘後不管子線程t結束沒,a都繼續運行下去,執行到return,主線程結束時子線程還可以繼續在運行,直到結束
# 如果join小括號中沒有設置,就代表,主線程在這個地方一直等著子線程結束後,主線程才繼續執行下去
#如果這個地方沒有join()這個方法,就代表,主線程不等子線程,主線程直接運行下去

print "__________a結束"
return "返回值"
cc=a_fun()
print cc


2、帶通信的多線程
這種情況主要是,當一個多線程,開了幾個子線程,想知道幾個子線程的執行情況的時候用到

#帶通信的多線程 Queue(隊列,先進先出)
import threading,Queue,time
q=Queue.Queue()

def c1(a1):
time.sleep(7)
print a1
q.put("c1 put 的內容")#put 存入到隊列中

def c2(a1):
time.sleep(4)
print a1
q.put("c2 put 的內容")# put 存入到隊列中

def a1():
print "a1開始_______"
cs1="第一個子線程cs1"
t1=threading.Thread(target=c1,args=(cs1,))
t1.start()

cs2="第二個子線程cs2"
t2=threading.Thread(target=c2,args=(cs2,))
t2.start()
qq=q.get() #獲取隊列中的內容,並刪除
if qq:      #如果隊列中有內容,說明兩個隊列已經執行一個了
print qq

a1()

如果在a1中想判斷 兩個線程是否都執行完了,可以用
  while True:
    if q.qsize()==2:
     
 print q.qsize()
      print q.get()
      break










python 多線程 及多線程通信