今天早上起來(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è)參考,也希望大家多多支持武林站長(zhǎng)站。
|
新聞熱點(diǎn)
疑難解答
圖片精選