
Python中多線程的創(chuàng)建及基本調(diào)用方法
由于注明的GIL的存在,Python盡管能創(chuàng)建多個(gè)線程,但是多線程卻不能同時(shí)工作...well,這里我們來(lái)看一下Python中多線程的創(chuàng)建及基本調(diào)用方法.
1. 多線程的作用
簡(jiǎn)而言之,多線程是并行處理相互獨(dú)立的子任務(wù),從而大幅度提高整個(gè)任務(wù)的效率。
2. Python中的多線程相關(guān)模塊和方法
Python中提供幾個(gè)用于多線程編程的模塊,包括thread,threading和Queue等
thread模塊提供了基本的線程和鎖的支持,除產(chǎn)生線程外,也提供基本的同步數(shù)據(jù)結(jié)構(gòu)鎖對(duì)象,其中包括:
start_new_thread(function, args kwargs=None) 產(chǎn)生一個(gè)新的線程來(lái)運(yùn)行給定函數(shù)
allocate_lock() 分配一個(gè)LockType類(lèi)型的鎖對(duì)象
exit() 讓線程退出
acquire(wait=None) 嘗試獲取鎖對(duì)象
locked() 如果獲取了鎖對(duì)象返回TRUE,否則返回FALSE
release() 釋放鎖
threading提供了更高級(jí)別,功能更強(qiáng)的線程管理功能
Thread類(lèi) 表示一個(gè)線程的執(zhí)行的對(duì)象
Lock 鎖原語(yǔ)對(duì)象
RLock 可重入鎖對(duì)象,使單線程可以再次獲得已經(jīng)獲取鎖
queue模塊允許用戶(hù)創(chuàng)建一個(gè)可以用于多個(gè)線程之間共享數(shù)據(jù)的隊(duì)列數(shù)據(jù)結(jié)構(gòu)
可用于進(jìn)程間的通訊,讓各個(gè)線程之間共享數(shù)據(jù)
模塊函數(shù)queue(size) 創(chuàng)建一個(gè)大小為size的Queue對(duì)象
queue對(duì)象函數(shù) qsize() 返回隊(duì)列大小
empty() 隊(duì)列為空返回True,否則返回False
put(item, block=0) 把ITEM放到隊(duì)列中,block不為0,函數(shù)會(huì)一直阻塞到隊(duì)列中
get(block=0) 從隊(duì)列中取一個(gè)對(duì)象,若果給block,函數(shù)會(huì)一直阻塞到隊(duì)列中有對(duì)象為止
3.示例
目前Python的lib中對(duì)多線程編程提供兩種啟動(dòng)方法,一種是比較基本的thread模塊中start_new_thread方法,在線程中運(yùn)行一個(gè)函數(shù), 另一種是使用集成threading模塊的線程對(duì)象Thread類(lèi)。
目前所用到的,是舊版本中調(diào)用thread模塊中的start_new_thread()函數(shù)來(lái)產(chǎn)生新的線程
相比而言,thread.start_new_thread(function,(args[,kwargs]))實(shí)現(xiàn)機(jī)制其實(shí)與C更為類(lèi)似,其中function參數(shù)是將要調(diào)用的線程函數(shù);(args[,kwargs])是將傳遞給待創(chuàng)建線程函數(shù)的參數(shù)組成的元組類(lèi)型,其中kwargs是可選的參數(shù)。新創(chuàng)建的線程結(jié)束一般依靠線程函數(shù)的執(zhí)行結(jié)束自動(dòng)退出,或者在線程函數(shù)中調(diào)用thread.exit()拋出SystemExit exception,達(dá)到線程退出的目的。
print "=======================thread.start_new_thread啟動(dòng)線程============="
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)前線程休眠指定時(shí)間,interval為浮點(diǎn)型的秒數(shù),不同于Java中的整形毫秒數(shù)
time.sleep(interval)
#Python不像大多數(shù)高級(jí)語(yǔ)言一樣支持++操作符,只能用+=實(shí)現(xiàn)
count+=1
else:
print "Thread-%d is over"%no
#可以等待線程被PVM回收,或主動(dòng)調(diào)用exit或exit_thread方法結(jié)束線程
thread.exit_thread()
#使用start_new_thread函數(shù)可以簡(jiǎn)單的啟動(dòng)一個(gè)線程,第一個(gè)參數(shù)指定線程中執(zhí)行的函數(shù),第二個(gè)參數(shù)為元組型的傳遞給指定函數(shù)的參數(shù)值
thread.start_new_thread(inthread,(1,2))
#線程執(zhí)行時(shí)必須添加這一行,并且sleep的時(shí)間必須足夠使線程結(jié)束,如本例
#如果休眠時(shí)間改為20,將可能會(huì)拋出異常
time.sleep(30)
'''
使用這種方法啟動(dòng)線程時(shí),有可能出現(xiàn)異常
Unhandled exception in thread started by
Error in sys.excepthook:
Original exception was:
解決:?jiǎn)?dòng)線程之后,須確保主線程等待所有子線程返回結(jié)果后再退出,如果主線程比子線程早結(jié)束,無(wú)論其子線程是否是后臺(tái)線程,都將會(huì)中斷,拋出這個(gè)異常
若沒(méi)有響應(yīng)阻塞等待,為避免主線程提前退出,必須調(diào)用time.sleep使主線程休眠足夠長(zhǎng)的時(shí)間,另外也可以采用加鎖機(jī)制來(lái)避免類(lèi)似情況,通過(guò)在啟動(dòng)線程的時(shí)候,給每個(gè)線程都加了一把鎖,直到線程運(yùn)行介紹,再釋放這個(gè)鎖。同時(shí)在Python的main線程中用一個(gè)while循環(huán)來(lái)不停的判斷每個(gè)線程鎖已釋放。
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();
很多介紹說(shuō)在新python版本中推薦使用Threading模塊,目前暫沒(méi)有應(yīng)用到。。。
數(shù)據(jù)分析咨詢(xún)請(qǐng)掃描二維碼
若不方便掃碼,搜微信號(hào):CDAshujufenxi
SQL Server 中 CONVERT 函數(shù)的日期轉(zhuǎn)換:從基礎(chǔ)用法到實(shí)戰(zhàn)優(yōu)化 在 SQL Server 的數(shù)據(jù)處理中,日期格式轉(zhuǎn)換是高頻需求 —— 無(wú)論 ...
2025-09-18MySQL 大表拆分與關(guān)聯(lián)查詢(xún)效率:打破 “拆分必慢” 的認(rèn)知誤區(qū) 在 MySQL 數(shù)據(jù)庫(kù)管理中,“大表” 始終是性能優(yōu)化繞不開(kāi)的話(huà)題。 ...
2025-09-18CDA 數(shù)據(jù)分析師:表結(jié)構(gòu)數(shù)據(jù) “獲取 - 加工 - 使用” 全流程的賦能者 表結(jié)構(gòu)數(shù)據(jù)(如數(shù)據(jù)庫(kù)表、Excel 表、CSV 文件)是企業(yè)數(shù)字 ...
2025-09-18DSGE 模型中的 Et:理性預(yù)期算子的內(nèi)涵、作用與應(yīng)用解析 動(dòng)態(tài)隨機(jī)一般均衡(Dynamic Stochastic General Equilibrium, DSGE)模 ...
2025-09-17Python 提取 TIF 中地名的完整指南 一、先明確:TIF 中的地名有哪兩種存在形式? 在開(kāi)始提取前,需先判斷 TIF 文件的類(lèi)型 —— ...
2025-09-17CDA 數(shù)據(jù)分析師:解鎖表結(jié)構(gòu)數(shù)據(jù)特征價(jià)值的專(zhuān)業(yè)核心 表結(jié)構(gòu)數(shù)據(jù)(以 “行 - 列” 規(guī)范存儲(chǔ)的結(jié)構(gòu)化數(shù)據(jù),如數(shù)據(jù)庫(kù)表、Excel 表、 ...
2025-09-17Excel 導(dǎo)入數(shù)據(jù)含缺失值?詳解 dropna 函數(shù)的功能與實(shí)戰(zhàn)應(yīng)用 在用 Python(如 pandas 庫(kù))處理 Excel 數(shù)據(jù)時(shí),“缺失值” 是高頻 ...
2025-09-16深入解析卡方檢驗(yàn)與 t 檢驗(yàn):差異、適用場(chǎng)景與實(shí)踐應(yīng)用 在數(shù)據(jù)分析與統(tǒng)計(jì)學(xué)領(lǐng)域,假設(shè)檢驗(yàn)是驗(yàn)證研究假設(shè)、判斷數(shù)據(jù)差異是否 “ ...
2025-09-16CDA 數(shù)據(jù)分析師:掌控表格結(jié)構(gòu)數(shù)據(jù)全功能周期的專(zhuān)業(yè)操盤(pán)手 表格結(jié)構(gòu)數(shù)據(jù)(以 “行 - 列” 存儲(chǔ)的結(jié)構(gòu)化數(shù)據(jù),如 Excel 表、數(shù)據(jù) ...
2025-09-16MySQL 執(zhí)行計(jì)劃中 rows 數(shù)量的準(zhǔn)確性解析:原理、影響因素與優(yōu)化 在 MySQL SQL 調(diào)優(yōu)中,EXPLAIN執(zhí)行計(jì)劃是核心工具,而其中的row ...
2025-09-15解析 Python 中 Response 對(duì)象的 text 與 content:區(qū)別、場(chǎng)景與實(shí)踐指南 在 Python 進(jìn)行 HTTP 網(wǎng)絡(luò)請(qǐng)求開(kāi)發(fā)時(shí)(如使用requests ...
2025-09-15CDA 數(shù)據(jù)分析師:激活表格結(jié)構(gòu)數(shù)據(jù)價(jià)值的核心操盤(pán)手 表格結(jié)構(gòu)數(shù)據(jù)(如 Excel 表格、數(shù)據(jù)庫(kù)表)是企業(yè)最基礎(chǔ)、最核心的數(shù)據(jù)形態(tài) ...
2025-09-15Python HTTP 請(qǐng)求工具對(duì)比:urllib.request 與 requests 的核心差異與選擇指南 在 Python 處理 HTTP 請(qǐng)求(如接口調(diào)用、數(shù)據(jù)爬取 ...
2025-09-12解決 pd.read_csv 讀取長(zhǎng)浮點(diǎn)數(shù)據(jù)的科學(xué)計(jì)數(shù)法問(wèn)題 為幫助 Python 數(shù)據(jù)從業(yè)者解決pd.read_csv讀取長(zhǎng)浮點(diǎn)數(shù)據(jù)時(shí)的科學(xué)計(jì)數(shù)法問(wèn)題 ...
2025-09-12CDA 數(shù)據(jù)分析師:業(yè)務(wù)數(shù)據(jù)分析步驟的落地者與價(jià)值優(yōu)化者 業(yè)務(wù)數(shù)據(jù)分析是企業(yè)解決日常運(yùn)營(yíng)問(wèn)題、提升執(zhí)行效率的核心手段,其價(jià)值 ...
2025-09-12用 SQL 驗(yàn)證業(yè)務(wù)邏輯:從規(guī)則拆解到數(shù)據(jù)把關(guān)的實(shí)戰(zhàn)指南 在業(yè)務(wù)系統(tǒng)落地過(guò)程中,“業(yè)務(wù)邏輯” 是連接 “需求設(shè)計(jì)” 與 “用戶(hù)體驗(yàn) ...
2025-09-11塔吉特百貨孕婦營(yíng)銷(xiāo)案例:數(shù)據(jù)驅(qū)動(dòng)下的精準(zhǔn)零售革命與啟示 在零售行業(yè) “流量紅利見(jiàn)頂” 的當(dāng)下,精準(zhǔn)營(yíng)銷(xiāo)成為企業(yè)突圍的核心方 ...
2025-09-11CDA 數(shù)據(jù)分析師與戰(zhàn)略 / 業(yè)務(wù)數(shù)據(jù)分析:概念辨析與協(xié)同價(jià)值 在數(shù)據(jù)驅(qū)動(dòng)決策的體系中,“戰(zhàn)略數(shù)據(jù)分析”“業(yè)務(wù)數(shù)據(jù)分析” 是企業(yè) ...
2025-09-11Excel 數(shù)據(jù)聚類(lèi)分析:從操作實(shí)踐到業(yè)務(wù)價(jià)值挖掘 在數(shù)據(jù)分析場(chǎng)景中,聚類(lèi)分析作為 “無(wú)監(jiān)督分組” 的核心工具,能從雜亂數(shù)據(jù)中挖 ...
2025-09-10統(tǒng)計(jì)模型的核心目的:從數(shù)據(jù)解讀到?jīng)Q策支撐的價(jià)值導(dǎo)向 統(tǒng)計(jì)模型作為數(shù)據(jù)分析的核心工具,并非簡(jiǎn)單的 “公式堆砌”,而是圍繞特定 ...
2025-09-10