對(duì)python多線程與global變量詳解
今天早上起來(lái)寫(xiě)爬蟲(chóng),基本框架已經(jīng)搭好,添加多線程爬取功能時(shí),發(fā)現(xiàn)出錯(cuò):
比如在下載文件的url列表中加入200個(gè)url,開(kāi)啟50個(gè)線程。我的爬蟲(chóng)…竟然將50個(gè)url爬取并全部命名為0.html,也就是說(shuō),最后的下載結(jié)果,是有1個(gè)0.html(重復(fù)的覆蓋了),還有1-150。下面是我的代碼:
x = str(theguardian_globle.g) #x為給下載的文件命的名 filePath = "E://wgetWeiBao//"+x+".html" try: wget.download(url,filePath) theguardian_globle.g+=1 print x+" is downloading..." except: print "error!"
#這個(gè)是全局變量g的定義 global g g = 0
后來(lái)終于發(fā)現(xiàn)問(wèn)題:多線程+全局變量是個(gè)危險(xiǎn)的組合,因?yàn)槌绦蛴卸鄠€(gè)線程在同時(shí)執(zhí)行,多個(gè)線程同時(shí)操作全局變量,會(huì)引起混亂。在多線程中操作全局變量,應(yīng)當(dāng)給該操作加鎖。
以下為修改后的代碼:
函數(shù): def downLoad(url,num): x = str(num) filePath = "E://wgetWeiBao//"+x+".html" try: wget.download(url,filePath) print x+" is downloading..." except: print "error!"
多線程消費(fèi)者_(dá)給操作全局變量的語(yǔ)句加鎖 class Cosumer(threading.Thread): def run(self): print('%s:started' % threading.current_thread()) while True: global gCondition gCondition.acquire() while q.empty()==True: gCondition.wait() url = q.get() num = theguardian_globle.g theguardian_globle.g+=1 gCondition.release() downLoad(url,num)
大功告成!
以上這篇對(duì)python多線程與global變量詳解就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
- Python global全局變量函數(shù)詳解
- python中g(shù)lobal與nonlocal比較
- python global關(guān)鍵字的用法詳解
- Python中 Global和Nonlocal的用法詳解
- python中g(shù)lobal用法實(shí)例分析
- python中的global關(guān)鍵字的使用方法
- Python中關(guān)鍵字global和nonlocal的區(qū)別詳解
- Python 內(nèi)置函數(shù)globals()和locals()對(duì)比詳解
- Python全局變量與global關(guān)鍵字常見(jiàn)錯(cuò)誤解決方案
- Python全局變量關(guān)鍵字global的簡(jiǎn)單使用
相關(guān)文章
python爬蟲(chóng)超時(shí)的處理的實(shí)例
今天小編就為大家分享一篇python爬蟲(chóng)超時(shí)的處理的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-12-12Python第三方包之DingDingBot釘釘機(jī)器人
這篇文章主要介紹了Python第三方包之DingDingBot釘釘機(jī)器人,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-04-04django haystack實(shí)現(xiàn)全文檢索的示例代碼
這篇文章主要介紹了django haystack實(shí)現(xiàn)全文檢索的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-06-06Pandas實(shí)現(xiàn)Dataframe的合并
我們知道,在使用pandas處理數(shù)據(jù)的時(shí)候,往往會(huì)需要合并兩個(gè)或者多個(gè)DataFrame的操作,那么本文就來(lái)介紹一下Pandas實(shí)現(xiàn)Dataframe的合并,感興趣的可以了解一下2021-06-06Pandas庫(kù)中dataframe.corr()函數(shù)的使用
dataframe.corr()是Pandas庫(kù)中的一個(gè)函數(shù),用于計(jì)算DataFrame中各列之間的相關(guān)系數(shù),本文主要介紹了Pandas庫(kù)中dataframe.corr()函數(shù)的使用,具有一定的參考價(jià)值,感興趣的可以了解一下2024-07-07詳解Python 關(guān)聯(lián)規(guī)則分析
這篇文章主要介紹了Python 關(guān)聯(lián)規(guī)則分析的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)使用python,感興趣的朋友可以了解下2021-03-03