国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

腳本之家,腳本語言編程技術及教程分享平臺!
分類導航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服務器之家 - 腳本之家 - Python - Python中多線程的創建及基本調用方法

Python中多線程的創建及基本調用方法

2020-09-01 09:16linda1000 Python

由于注明的GIL的存在,Python盡管能創建多個線程,但是多線程卻不能同時工作...well,這里我們來看一下Python中多線程的創建及基本調用方法

1. 多線程的作用
簡而言之,多線程是并行處理相互獨立的子任務,從而大幅度提高整個任務的效率。

2. Python中的多線程相關模塊和方法
Python中提供幾個用于多線程編程的模塊,包括thread,threading和Queue等
thread模塊提供了基本的線程和鎖的支持,除產生線程外,也提供基本的同步數據結構鎖對象,其中包括:
start_new_thread(function, args kwargs=None)  產生一個新的線程來運行給定函數
allocate_lock()  分配一個LockType類型的鎖對象
exit() 讓線程退出
acquire(wait=None) 嘗試獲取鎖對象
locked()  如果獲取了鎖對象返回TRUE,否則返回FALSE
release()  釋放鎖
threading提供了更高級別,功能更強的線程管理功能
Thread類 表示一個線程的執行的對象
Lock 鎖原語對象
RLock 可重入鎖對象,使單線程可以再次獲得已經獲取鎖
queue模塊允許用戶創建一個可以用于多個線程之間共享數據的隊列數據結構
可用于進程間的通訊,讓各個線程之間共享數據
模塊函數queue(size)  創建一個大小為size的Queue對象
queue對象函數 qsize()  返回隊列大小
empty()  隊列為空返回True,否則返回False
put(item, block=0)  把ITEM放到隊列中,block不為0,函數會一直阻塞到隊列中
get(block=0) 從隊列中取一個對象,若果給block,函數會一直阻塞到隊列中有對象為止

3.示例
目前Python的lib中對多線程編程提供兩種啟動方法,一種是比較基本的thread模塊中start_new_thread方法,在線程中運行一個函數, 另一種是使用集成threading模塊的線程對象Thread類。
目前所用到的,是舊版本中調用thread模塊中的start_new_thread()函數來產生新的線程
相比而言,thread.start_new_thread(function,(args[,kwargs]))實現機制其實與C更為類似,其中function參數是將要調用的線程函數;(args[,kwargs])是將傳遞給待創建線程函數的參數組成的元組類型,其中kwargs是可選的參數。新創建的線程結束一般依靠線程函數的執行結束自動退出,或者在線程函數中調用thread.exit()拋出SystemExit exception,達到線程退出的目的。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
print "=======================thread.start_new_thread啟動線程============="
import thread 
#Python的線程sleep方法并不是在thread模塊中,反而是在time模塊下 
import time 
def inthread(no,interval): 
  count=0
  while count<10
    print "Thread-%d,休眠間隔:%d,current Time:%s"%(no,interval,time.ctime()) 
    #使當前線程休眠指定時間,interval為浮點型的秒數,不同于Java中的整形毫秒數 
    time.sleep(interval) 
    #Python不像大多數高級語言一樣支持++操作符,只能用+=實現 
    count+=1
  else
    print "Thread-%d is over"%no 
    #可以等待線程被PVM回收,或主動調用exit或exit_thread方法結束線程 
    thread.exit_thread() 
#使用start_new_thread函數可以簡單的啟動一個線程,第一個參數指定線程中執行的函數,第二個參數為元組型的傳遞給指定函數的參數值 
thread.start_new_thread(inthread,(1,2)) 
  #線程執行時必須添加這一行,并且sleep的時間必須足夠使線程結束,如本例 
  #如果休眠時間改為20,將可能會拋出異常 
time.sleep(30
''' 

使用這種方法啟動線程時,有可能出現異常

?
1
2
3
Unhandled exception in thread started by
Error in sys.excepthook:
Original exception was:

解決:啟動線程之后,須確保主線程等待所有子線程返回結果后再退出,如果主線程比子線程早結束,無論其子線程是否是后臺線程,都將會中斷,拋出這個異常
若沒有響應阻塞等待,為避免主線程提前退出,必須調用time.sleep使主線程休眠足夠長的時間,另外也可以采用加鎖機制來避免類似情況,通過在啟動線程的時候,給每個線程都加了一把鎖,直到線程運行介紹,再釋放這個鎖。同時在Python的main線程中用一個while循環來不停的判斷每個線程鎖已釋放。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
import thread; 
from time import sleep,ctime; 
from random import choice 
#The first param means the thread number 
#The second param means how long it sleep 
#The third param means the Lock 
def loop(nloop,sec,lock): 
  print "Thread ",nloop," start and will sleep ",sec; 
  sleep(sec); 
  print "Thread ",nloop," end ",sec; 
  lock.release(); 
  
def main(): 
  seconds=[4,2]; 
  locks=[]; 
  for i in range(len(seconds)) : 
    lock=thread.allocate_lock(); 
    lock.acquire(); 
    locks.append(lock); 
      
  print "main Thread begins:",ctime(); 
  for i,lock in enumerate(locks): 
    thread.start_new_thread(loop,(i,choice(seconds),lock)); 
  for lock in locks : 
    while lock.locked() :  
      pass
  print "main Thread ends:",ctime(); 
  
if __name__=="__main__"
  main(); 

很多介紹說在新python版本中推薦使用Threading模塊,目前暫沒有應用到。。。

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 久久久成人精品 | 亚洲国产精品美女 | 欧美一区二区三区在线 | 国产欧美一区二区精品性色 | 中国一极毛片 | 成人精品| 粉嫩欧美一区二区三区高清影视 | 欧美午夜一区 | 亚洲国产精品久久人人爱 | 亚洲午夜在线 | 久久99精品久久久久久水蜜桃 | 成人在线观 | 午夜资源 | 亚洲精品在线播放 | 欧美一区二区三区在线播放 | 全部古装三级在线播放 | 在线成年人电影 | 国产成人精品一区二区三区四区 | 欧美亚洲在线 | 在线va| 日韩av免费在线观看 | 不卡一区| 成人欧美一区二区三区在线观看 | 91xxx在线观看 | 影音先锋男 | 欧美 日韩 中文字幕 | 亚洲一区二区三区在线 | 毛片网站大全 | www操com| 亚洲精品视频观看 | 欧美视频在线一区 | 久久不色 | 国产成人一区二区在线观看 | 九色 在线 | 国产一级毛片国语一级 | 亚洲精品一区二区三区 | 国产成人精品av | 日韩91视频 | 中文字幕一区三级久久日本 | 911av视频 | 一区二区三区视频在线观看 |