對(duì)python多線程與global變量詳解
今天早上起來寫爬蟲,基本框架已經(jīng)搭好,添加多線程爬取功能時(shí),發(fā)現(xiàn)出錯(cuò):
比如在下載文件的url列表中加入200個(gè)url,開啟50個(gè)線程。我的爬蟲…竟然將50個(gè)url爬取并全部命名為0.html,也就是說,最后的下載結(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
后來終于發(fā)現(xià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)鍵字常見錯(cuò)誤解決方案
- Python全局變量關(guān)鍵字global的簡(jiǎn)單使用
相關(guān)文章
Python程序員面試題 你必須提前準(zhǔn)備!(答案及解析)
這篇文章主要為大家解析了你必須提前準(zhǔn)備的Python程序員面試題答案,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-01-01
Python處理字符串的常用函數(shù)實(shí)例總結(jié)
在數(shù)據(jù)分析中,特別是文本分析中,字符處理需要耗費(fèi)極大的精力,因而了解字符處理對(duì)于數(shù)據(jù)分析而言,也是一項(xiàng)很重要的能力,這篇文章主要給大家介紹了關(guān)于Python處理字符串的常用函數(shù),需要的朋友可以參考下2021-11-11
PyTorch一小時(shí)掌握之a(chǎn)utograd機(jī)制篇
這篇文章主要介紹了PyTorch一小時(shí)掌握之a(chǎn)utograd機(jī)制篇,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-09-09
Python如何把Spark數(shù)據(jù)寫入ElasticSearch
這篇文章主要介紹了Python如何把Spark數(shù)據(jù)寫入ElasticSearch,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-04-04
Python查詢Mysql時(shí)返回字典結(jié)構(gòu)的代碼
MySQLdb默認(rèn)查詢結(jié)果都是返回tuple,輸出時(shí)候不是很方便,必須按照0,1這樣讀取,無意中在網(wǎng)上找到簡(jiǎn)單的修改方法,就是傳遞一個(gè)cursors.DictCursor就行2012-06-06
Python?OpenCV實(shí)現(xiàn)人物動(dòng)漫化效果
這篇文章主要介紹了利用Python和OpenCV實(shí)現(xiàn)人物的動(dòng)漫化特效,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)Python和OpenCV有一定的幫助,需要的可以了解一下2022-01-01
OpenCV+Python識(shí)別車牌和字符分割的實(shí)現(xiàn)
這篇文章主要介紹了OpenCV+Python識(shí)別車牌和字符分割的實(shí)現(xiàn),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2019-01-01

