Python 多线程总结(1)- thread 模块
生活随笔
收集整理的這篇文章主要介紹了
Python 多线程总结(1)- thread 模块
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
thread 模塊
1. 單線程
首先看下單線程程序運行的例子,如下所示,
import timedef loop0():print 'start loop0 begin', time.ctime()time.sleep(4)print 'start loop0 end', time.ctime()def loop1():print 'start loop1 begin', time.ctime()time.sleep(2)print 'start loop1 end', time.ctime()def main():print 'main is start', time.ctime()loop0()loop1()print 'main is end', time.ctime()if __name__ == '__main__':main()
程序運行結果如下:
'''
main is start Sat Jul 21 19:47:41 2018
start loop0 begin Sat Jul 21 19:47:41 2018
start loop0 end Sat Jul 21 19:47:45 2018
start loop1 begin Sat Jul 21 19:47:45 2018
start loop1 end Sat Jul 21 19:47:47 2018
main is end Sat Jul 21 19:47:47 2018
'''
從運行結果可以看出,函數是按照順序依次執行。運行總時間是各個函數運行的時間總和。
2. 簡單多線程
簡單多線程我們先使用 thread 模塊,下面看個簡單示例
import thread
import timedef loop0():print 'loop0 begin', time.ctime()time.sleep(4)print 'loop0 end', time.ctime()def loop1():print 'loop1 begin', time.ctime()time.sleep(2)print 'loop1 end', time.ctime()def main():print 'main is start', time.ctime()thread.start_new_thread(loop0, ()) # 第一個參數為函數,第二個參數為元組,即使是空值也要寫成空的元組thread.start_new_thread(loop1, ())time.sleep(6) # 保障其他線程執行完畢后再關閉主進程,此處我們知道最長是6s,如果不知道就需要使用鎖print 'main is end', time.ctime()if __name__ == '__main__':main()
程序運行結果如下:
'''
main is start Sat Jul 21 19:56:50 2018
loop0 begin Sat Jul 21 19:56:50 2018
loop1 begin Sat Jul 21 19:56:50 2018
loop1 end Sat Jul 21 19:56:52 2018
loop0 end Sat Jul 21 19:56:54 2018
main is end Sat Jul 21 19:56:56 2018
'''
從運行結果可以看出,loop0 和 loop1 兩個函數是并行運行的,程序中的 time.sleep(6) 是由于要保障其他線程執行完畢后再關閉主進程,此處我們知道最長是 6s,如果不知道就需要使用鎖。
3. 使用簡單鎖
在本程序中,我們使用簡單的鎖來讓主進程動態地等待子線程執行結束再結束主進程。
import thread
import timeloops = [4, 2]def loop(nloop, nsec, lock):print 'start loop', nloop, 'at:', time.ctime()time.sleep(nsec)print 'stop loop', nloop, 'at:', time.ctime()lock.release() # 釋放相應的鎖,通知主線程該線程已經退出了def main():print 'main is start at:', time.ctime()locks = []nloops = range(len(loops))for i in nloops:lock = thread.allocate_lock() # 創建一個鎖列表lock.acquire() # 分別調用acquire獲得鎖locks.append(lock)for i in nloops: # 循環創建線程,放到上面循環之后是因為:獲取鎖需要一段時間,有可能出現還沒有獲得鎖,線程就結束的情況thread.start_new_thread(loop,(i, loops[i], locks[i]))for i in nloops:while locks[i].locked():passprint 'main is end at:', time.ctime()if __name__ == '__main__':main()
程序運行結果如下:
'''
main is start at: Sat Jul 21 20:07:08 2018
start loop 0 at: Sat Jul 21 20:07:08 2018
start loop 1 at: Sat Jul 21 20:07:08 2018
stop loop 1 at: Sat Jul 21 20:07:10 2018
stop loop 0 at: Sat Jul 21 20:07:12 2018
main is end at: Sat Jul 21 20:07:12 2018
'''
總結
以上是生活随笔為你收集整理的Python 多线程总结(1)- thread 模块的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python 笔试面试及常用技巧 (1)
- 下一篇: Python 多线程总结(2)— 线程锁