標籤:
說起多線程,必然想到了進程、鎖等東西,python跟線程有關的模組有thread模組、threading模組、Queue模組、mutex模組、SocketServer模組。thread模組提供了基本的線程和鎖的支援,但不建議使用,因為當主線程退出的時候,所有其它線程沒有被清除就退出了,而threading模組提供了功能更強的線程管理能力,能確保所有重要的子線程都退出後,進程才結束。Queue模組允許使用者建立一個可以用於多個線程之間共用資料的隊列資料結構。mutex是個互斥對象,SocketServer具有線程式控制制的TCP和UDP管理器。
如果用到了thread模組,在start_new_thread建立一個新的線程之前,可能要allocate_lock分配一個LockType類型的鎖對象,然後去acquire擷取鎖對象,建立線程之後,在新線程中做完某些事情就可以release釋放鎖,通常要在主線程中檢查每個線程鎖locked狀態,當所有鎖release之後主線程結束。
threading模組不必像thread模組那樣操作鎖,只需join使程式掛起即可。threading模組中的Thread類是主要的運行對象,常用的有幾種比較相像的用法,如建立Thread執行個體後傳給它一個函數或一個可調用的類對象(可通過apply()實現_ _call__()),或者是從Thread派生一個子類(重寫run())並建立這個子類的執行個體。下面展示一個簡單的例子,建立兩個線程,Thread執行個體中傳入函數,分別sleep6妙、3妙,主線程顯示運行總時間。
#!/usr/bin/env pythonimport threadingfrom time import sleep, ctimeloops = [6, 3] # sleep secdef loop(nloop, nsec): print ‘start loop‘, nloop, ‘at:‘, ctime() sleep(nsec) print ‘loop‘, nloop, ‘done at:‘, ctime()def main(): print ‘starting at:‘, ctime() threads = [] nloops = range(len(loops)) for i in nloops: t = threading.Thread(target = loop, args = (i, loops[i])) threads.append(t) 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多線程編程