
Python中多線程的創(chuàng)建及基本調(diào)用方法
由于注明的GIL的存在,Python盡管能創(chuàng)建多個線程,但是多線程卻不能同時工作...well,這里我們來看一下Python中多線程的創(chuàng)建及基本調(diào)用方法.
1. 多線程的作用
簡而言之,多線程是并行處理相互獨立的子任務(wù),從而大幅度提高整個任務(wù)的效率。
2. Python中的多線程相關(guān)模塊和方法
Python中提供幾個用于多線程編程的模塊,包括thread,threading和Queue等
thread模塊提供了基本的線程和鎖的支持,除產(chǎn)生線程外,也提供基本的同步數(shù)據(jù)結(jié)構(gòu)鎖對象,其中包括:
start_new_thread(function, args kwargs=None) 產(chǎn)生一個新的線程來運行給定函數(shù)
allocate_lock() 分配一個LockType類型的鎖對象
exit() 讓線程退出
acquire(wait=None) 嘗試獲取鎖對象
locked() 如果獲取了鎖對象返回TRUE,否則返回FALSE
release() 釋放鎖
threading提供了更高級別,功能更強的線程管理功能
Thread類 表示一個線程的執(zhí)行的對象
Lock 鎖原語對象
RLock 可重入鎖對象,使單線程可以再次獲得已經(jīng)獲取鎖
queue模塊允許用戶創(chuàng)建一個可以用于多個線程之間共享數(shù)據(jù)的隊列數(shù)據(jù)結(jié)構(gòu)
可用于進程間的通訊,讓各個線程之間共享數(shù)據(jù)
模塊函數(shù)queue(size) 創(chuàng)建一個大小為size的Queue對象
queue對象函數(shù) qsize() 返回隊列大小
empty() 隊列為空返回True,否則返回False
put(item, block=0) 把ITEM放到隊列中,block不為0,函數(shù)會一直阻塞到隊列中
get(block=0) 從隊列中取一個對象,若果給block,函數(shù)會一直阻塞到隊列中有對象為止
3.示例
目前Python的lib中對多線程編程提供兩種啟動方法,一種是比較基本的thread模塊中start_new_thread方法,在線程中運行一個函數(shù), 另一種是使用集成threading模塊的線程對象Thread類。
目前所用到的,是舊版本中調(diào)用thread模塊中的start_new_thread()函數(shù)來產(chǎn)生新的線程
相比而言,thread.start_new_thread(function,(args[,kwargs]))實現(xiàn)機制其實與C更為類似,其中function參數(shù)是將要調(diào)用的線程函數(shù);(args[,kwargs])是將傳遞給待創(chuàng)建線程函數(shù)的參數(shù)組成的元組類型,其中kwargs是可選的參數(shù)。新創(chuàng)建的線程結(jié)束一般依靠線程函數(shù)的執(zhí)行結(jié)束自動退出,或者在線程函數(shù)中調(diào)用thread.exit()拋出SystemExit exception,達到線程退出的目的。
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())
#使當(dāng)前線程休眠指定時間,interval為浮點型的秒數(shù),不同于Java中的整形毫秒數(shù)
time.sleep(interval)
#Python不像大多數(shù)高級語言一樣支持++操作符,只能用+=實現(xiàn)
count+=1
else:
print "Thread-%d is over"%no
#可以等待線程被PVM回收,或主動調(diào)用exit或exit_thread方法結(jié)束線程
thread.exit_thread()
#使用start_new_thread函數(shù)可以簡單的啟動一個線程,第一個參數(shù)指定線程中執(zhí)行的函數(shù),第二個參數(shù)為元組型的傳遞給指定函數(shù)的參數(shù)值
thread.start_new_thread(inthread,(1,2))
#線程執(zhí)行時必須添加這一行,并且sleep的時間必須足夠使線程結(jié)束,如本例
#如果休眠時間改為20,將可能會拋出異常
time.sleep(30)
'''
使用這種方法啟動線程時,有可能出現(xiàn)異常
Unhandled exception in thread started by
Error in sys.excepthook:
Original exception was:
解決:啟動線程之后,須確保主線程等待所有子線程返回結(jié)果后再退出,如果主線程比子線程早結(jié)束,無論其子線程是否是后臺線程,都將會中斷,拋出這個異常
若沒有響應(yīng)阻塞等待,為避免主線程提前退出,必須調(diào)用time.sleep使主線程休眠足夠長的時間,另外也可以采用加鎖機制來避免類似情況,通過在啟動線程的時候,給每個線程都加了一把鎖,直到線程運行介紹,再釋放這個鎖。同時在Python的main線程中用一個while循環(huán)來不停的判斷每個線程鎖已釋放。
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模塊,目前暫沒有應(yīng)用到。。。
數(shù)據(jù)分析咨詢請掃描二維碼
若不方便掃碼,搜微信號:CDAshujufenxi
LSTM 模型輸入長度選擇技巧:提升序列建模效能的關(guān)鍵? 在循環(huán)神經(jīng)網(wǎng)絡(luò)(RNN)家族中,長短期記憶網(wǎng)絡(luò)(LSTM)憑借其解決長序列 ...
2025-07-11CDA 數(shù)據(jù)分析師報考條件詳解與準(zhǔn)備指南? ? 在數(shù)據(jù)驅(qū)動決策的時代浪潮下,CDA 數(shù)據(jù)分析師認(rèn)證愈發(fā)受到矚目,成為眾多有志投身數(shù) ...
2025-07-11數(shù)據(jù)透視表中兩列相乘合計的實用指南? 在數(shù)據(jù)分析的日常工作中,數(shù)據(jù)透視表憑借其強大的數(shù)據(jù)匯總和分析功能,成為了 Excel 用戶 ...
2025-07-11尊敬的考生: 您好! 我們誠摯通知您,CDA Level I和 Level II考試大綱將于 2025年7月25日 實施重大更新。 此次更新旨在確保認(rèn) ...
2025-07-10BI 大數(shù)據(jù)分析師:連接數(shù)據(jù)與業(yè)務(wù)的價值轉(zhuǎn)化者? ? 在大數(shù)據(jù)與商業(yè)智能(Business Intelligence,簡稱 BI)深度融合的時代,BI ...
2025-07-10SQL 在預(yù)測分析中的應(yīng)用:從數(shù)據(jù)查詢到趨勢預(yù)判? ? 在數(shù)據(jù)驅(qū)動決策的時代,預(yù)測分析作為挖掘數(shù)據(jù)潛在價值的核心手段,正被廣泛 ...
2025-07-10數(shù)據(jù)查詢結(jié)束后:分析師的收尾工作與價值深化? ? 在數(shù)據(jù)分析的全流程中,“query end”(查詢結(jié)束)并非工作的終點,而是將數(shù) ...
2025-07-10CDA 數(shù)據(jù)分析師考試:從報考到取證的全攻略? 在數(shù)字經(jīng)濟蓬勃發(fā)展的今天,數(shù)據(jù)分析師已成為各行業(yè)爭搶的核心人才,而 CDA(Certi ...
2025-07-09【CDA干貨】單樣本趨勢性檢驗:捕捉數(shù)據(jù)背后的時間軌跡? 在數(shù)據(jù)分析的版圖中,單樣本趨勢性檢驗如同一位耐心的偵探,專注于從單 ...
2025-07-09year_month數(shù)據(jù)類型:時間維度的精準(zhǔn)切片? ? 在數(shù)據(jù)的世界里,時間是最不可或缺的維度之一,而year_month數(shù)據(jù)類型就像一把精準(zhǔn) ...
2025-07-09CDA 備考干貨:Python 在數(shù)據(jù)分析中的核心應(yīng)用與實戰(zhàn)技巧? ? 在 CDA 數(shù)據(jù)分析師認(rèn)證考試中,Python 作為數(shù)據(jù)處理與分析的核心 ...
2025-07-08SPSS 中的 Mann-Kendall 檢驗:數(shù)據(jù)趨勢與突變分析的有力工具? ? ? 在數(shù)據(jù)分析的廣袤領(lǐng)域中,準(zhǔn)確捕捉數(shù)據(jù)的趨勢變化以及識別 ...
2025-07-08備戰(zhàn) CDA 數(shù)據(jù)分析師考試:需要多久?如何規(guī)劃? CDA(Certified Data Analyst)數(shù)據(jù)分析師認(rèn)證作為國內(nèi)權(quán)威的數(shù)據(jù)分析能力認(rèn)證 ...
2025-07-08LSTM 輸出不確定的成因、影響與應(yīng)對策略? 長短期記憶網(wǎng)絡(luò)(LSTM)作為循環(huán)神經(jīng)網(wǎng)絡(luò)(RNN)的一種變體,憑借獨特的門控機制,在 ...
2025-07-07統(tǒng)計學(xué)方法在市場調(diào)研數(shù)據(jù)中的深度應(yīng)用? 市場調(diào)研是企業(yè)洞察市場動態(tài)、了解消費者需求的重要途徑,而統(tǒng)計學(xué)方法則是市場調(diào)研數(shù) ...
2025-07-07CDA數(shù)據(jù)分析師證書考試全攻略? 在數(shù)字化浪潮席卷全球的當(dāng)下,數(shù)據(jù)已成為企業(yè)決策、行業(yè)發(fā)展的核心驅(qū)動力,數(shù)據(jù)分析師也因此成為 ...
2025-07-07剖析 CDA 數(shù)據(jù)分析師考試題型:解鎖高效備考與答題策略? CDA(Certified Data Analyst)數(shù)據(jù)分析師考試作為衡量數(shù)據(jù)專業(yè)能力的 ...
2025-07-04SQL Server 字符串截取轉(zhuǎn)日期:解鎖數(shù)據(jù)處理的關(guān)鍵技能? 在數(shù)據(jù)處理與分析工作中,數(shù)據(jù)格式的規(guī)范性是保證后續(xù)分析準(zhǔn)確性的基礎(chǔ) ...
2025-07-04CDA 數(shù)據(jù)分析師視角:從數(shù)據(jù)迷霧中探尋商業(yè)真相? 在數(shù)字化浪潮席卷全球的今天,數(shù)據(jù)已成為企業(yè)決策的核心驅(qū)動力,CDA(Certifie ...
2025-07-04CDA 數(shù)據(jù)分析師:開啟數(shù)據(jù)職業(yè)發(fā)展新征程? ? 在數(shù)據(jù)成為核心生產(chǎn)要素的今天,數(shù)據(jù)分析師的職業(yè)價值愈發(fā)凸顯。CDA(Certified D ...
2025-07-03