1. 程式人生 > >python多執行緒與global變數

python多執行緒與global變數


今天早上起來寫爬蟲,基本框架已經搭好,新增多執行緒爬取功能時,發現出錯:

比如在下載檔案的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)


大功告成!