說起多執行緒,必然想到了程序、鎖等東西,python跟執行緒有關的模組有thread模組、threading模組、queue模組、mutex模組、socketserver模組。thread模組提供了基本的執行緒和鎖的支援,但不建議使用,因為當主線程退出的時候,所有其它執行緒沒有被清除就退出了,而threading模組提供了功能更強的執行緒管理能力,能確保所有重要的子執行緒都退出後,程序才結束。queue模組允許使用者建立乙個可以用於多個執行緒之間共享資料的佇列資料結構。mutex是個互斥物件,socketserver具有執行緒控制的tcp和udp管理器。
如果用到了thread模組,在start_new_thread建立乙個新的執行緒之前,可能要allocate_lock分配乙個locktype型別的鎖物件,然後去acquire獲取鎖物件,建立執行緒之後,在新執行緒中做完某些事情就可以release釋放鎖,通常要在主線程中檢查每個執行緒鎖locked狀態,當所有鎖release之後主線程結束。
#!/usr/bin/env python
import threading
from time import sleep, ctime
loops = [6, 3] # sleep sec
defloop
(nloop, nsec):
print
'start loop', nloop, 'at:', ctime()
sleep(nsec)
print
'loop', nloop, 'done at:', ctime()
defmain
():print
'starting at:', ctime()
threads =
nloops = range(len(loops))
for i in nloops:
t = threading.thread(target = loop, args = (i, loops[i]))
for i in nloops:
threads[i].start()
for i in nloops:
threads[i].join()
print
'all done at:', ctime()
if __name__ == '__main__':
main()
下面是執行結果:
starting at: tue jun 9 09:56:32 2015
start loop 0 at: tue jun 9 09:56:32 2015
start loop 1 at: tue jun 9 09:56:32 2015
loop 1 done at: tue jun 9 09:56:35 2015
loop 0 done at: tue jun 9 09:56:38 2015
all done at: tue jun 9 09:56:38 2015
可以看出,主線程時間為子執行緒時間較長的那個時間,6秒。
python python為何多執行緒無法切換
寫了乙個kafka傳輸訊息,celery發布任務的指令碼。有四個執行緒,分別讀取不同的kafka佇列資訊 問題是,只有第乙個執行緒會啟動,剩下的三個執行緒連start都執行不了。而且這個問題不是一開始就發生的,最開始跑 的時候很正常。連續執行了半個月都沒問題。就是後來重啟後就有問題了。後來發現,在每...
python python為何多執行緒無法切換
寫了乙個kafka傳輸訊息,celery發布任務的指令碼。有四個執行緒,分別讀取不同的kafka佇列資訊 問題是,只有第乙個執行緒會啟動,剩下的三個執行緒連start都執行不了。而且這個問題不是一開始就發生的,最開始跑 的時候很正常。連續執行了半個月都沒問題。就是後來重啟後就有問題了。後來發現,在每...
多執行緒 多執行緒原理
我們首先要知道什麼是多執行緒,說白了就是多個執行緒,執行緒是什麼呢,其實就是程序執行的途徑,那麼說道這裡我們又引入了乙個新的名字,就是程序,那麼我們來看看什麼是程序,其實我們自己也能看到,啟動電腦的任務管理器,我們就可以看到程序選項,裡面是我們電腦所有的程序,我們會發現有很多的程序.簡單地說就是程序...