python入門多線程(python之線程)
2023-04-20 03:57:02 2
# -*- coding: UTF-8 -*-import threadimport time# start_new_thread(function,args, kwargs=None) 生成一個新的線程# allocate_lock 分片locktype鎖對象# exit 給線程退出指令# acquire(wait=None) 嘗試獲取鎖的對象# locked 如果獲取了鎖對象則返回True, 否則,返回False# release 釋放鎖def loop0: print "start loop 0 at:", time.ctime time.sleep(4) print "loop 0 done at:", time.ctimedef loop1: print 'start loop 1 at', time.ctime time.sleep(2) print "loop 1 done at:", time.ctimedef main: print "starting at: ", time.ctime # loop0 # loop1 thread.start_new(loop0, ) thread.start_new(loop1, ) time.sleep(6) print "all Done at: ", time.ctime#不加線程時,需要6-7s,通過線程後,腳本運行只需要4sif __name__ == '__main__': main
# -*- coding: UTF-8 -*-# -*- coding: UTF-8 -*-import threadimport time# 使用線程和鎖。# 通過使用鎖,可以在所有線程全部完成執行後立即退出。# start_new_thread(function,args, kwargs=None) 生成一個新的線程,使用給定的args和可選的kwargs來執行function# allocate_lock 分配locktype鎖對象# exit 給線程退出指令# acquire(wait=None) 嘗試獲取鎖的對象# locked 如果獲取了鎖對象則返回True, 否則,返回False# release 釋放鎖loops = [4, 2]def loop(nloop, nsec, lock): print "start loop 0 at:", time.ctime time.sleep(nsec) print "loop", nloop, 'done at:', time.ctime lock.releasedef main: print 'starting at:', time.ctime locks = [] nloops = range(len(loops)) for i in nloops: #分配鎖,獲取鎖對象 lock = thread.allocate_lock #取得每一個鎖,相當於將「把鎖鎖上」,鎖上之後,將鎖添加到鎖列表locks中 lock.acquire locks.append(lock) for i in nloops: #調用函數loop,並傳遞3個參數: # i, 對應loop(nloop, nsec, lock):的nloop # loops[i], 對應loop(nloop, nsec, lock):的nsec # locks[i]:鎖對象,對應函數lock參數 thread.start_new(loop, (i, loops[i], locks[i])) for i in nloops: while locks[i].locked: pass print 'all Done at:', time.ctimeif __name__ == '__main__': main#輸出# starting at: Thu May 12 23:37:28 2022# start loop 0 at: start loop 0 at:Thu May 12 23:37:28 2022 # Thu May 12 23:37:28 2022# loop 1 done at: Thu May 12 23:37:30 2022# loop 0 done at: Thu May 12 23:37:32 2022# all Done at: Thu May 12 23:37:32 2022
# -*- coding: UTF-8 -*-import threadingimport time# threadming模塊# thread,表示執行一個線程的對象# lock,鎖對象,和thread模塊中的鎖一樣# Rlock,可重入鎖對象,使單一線程可以再次獲得已持有的鎖(遞歸鎖)# Condition,條件變量對象,使得一個線程等等另一個線程滿足特定的條件,比如改變狀態或者某一個值# Even,條件變量的通用版本,任意數量的線程等待某一個事件的發生,在該事件發生後所有線程將被激活# Semaphore: 為線程間共享的有限資源提供一個計數器,如果沒有可用資源時會被阻塞# BoundSemaphore: 與Semaphore相似,不過他不允許超過初始值# Timer: 與Thread相似,不過它要在運行前等待一段時間# Barrier: 創建一個障礙,必須達到指定數量的線程後才可以繼續# thread模塊:不支持守護線程,當主線程結束後,所有子線程都終止。# threading.Thread對象屬性# name, 線程名# ident: 線程標識符# daemon: 布爾標誌,表示這個線程是否是守護線程# threading.Thread對象方法# __init__(group=None, target=None, name=None, args=, kwargs={}, verbase=None, daemon=None)# 實例化一個線程對象,需要一個可調用的target,以及其參數args或kwargs,還可以傳遞name或group參數。# 此外verbose 標誌也可以接受# daemon的值將會設定為thread.daemon屬性/標誌# start,開始執行線程# run,定義線程功能,通常在子類中被應用重寫# join(timeout=None),直到啟動的線程終止之前一直掛起,除非給出了timeout(秒),否則會一直阻塞# getName,返回線程名# setName,設定線程名# isAlive/is_alive,布爾標誌,表示這個線程是否存活# isDaemon,如果是守護線程,則返回True,否則返回False# setDaemon(daemon),把線程的守護標誌設定為布爾值 daemonic(必須在線程 start之前調用)loops = [4, 2]def loop(nloop, nsec): print 'start loop', nloop, 'at:', time.ctime time.sleep(nsec) print 'loop', nloop, 'done at:', time.ctimedef main: print 'starting at:', time.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:', time.ctimeif __name__ == "__main__": main#輸出結果# starting at: Fri May 13 00:22:22 2022# start loop 0 at: Fri May 13 00:22:22 2022# start loop 1 at: Fri May 13 00:22:22 2022# loop 1 done at: Fri May 13 00:22:24 2022# loop 0 done at: Fri May 13 00:22:26 2022# all done at: Fri May 13 00:22:26 2022
,