您好,登錄后才能下訂單哦!
今天早上起來寫爬蟲,基本框架已經搭好,添加多線程爬取功能時,發現出錯:
比如在下載文件的url列表中加入200個url,開啟50個線程。我的爬蟲…竟然將50個url爬取并全部命名為0.html,也就是說,最后的下載結果,是有1個0.html(重復的覆蓋了),還有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的定義 global g g = 0
后來終于發現問題:多線程+全局變量是個危險的組合,因為程序有多個線程在同時執行,多個線程同時操作全局變量,會引起混亂。在多線程中操作全局變量,應當給該操作加鎖。
以下為修改后的代碼:
函數: def downLoad(url,num): x = str(num) filePath = "E://wgetWeiBao//"+x+".html" try: wget.download(url,filePath) print x+" is downloading..." except: print "error!"
多線程消費者_給操作全局變量的語句加鎖 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)
大功告成!
以上這篇對python多線程與global變量詳解就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持億速云。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。