python中的佇列,程序池
阿新 • • 發佈:2019-01-09
爬蟲中的佇列能夠起到執行緒安全的作用,比如說一個執行緒訪問佇列中的資料的時候,另外一個執行緒就就能訪問了。這樣取資料就不會發生資料重複。但是列表就不可以了,列表你一個執行緒訪問列表裡面的資料,其他執行緒也可能會重複訪問這個資料,這樣拿出來的資料就有可能重複。即是佇列中的資料同一時刻只能被一個執行緒訪問,列表中的資料可能同一時刻可能被多個執行緒訪問,造成資料重複,不安全。
用佇列另外一個好處是可以解耦,可以讓兩個函式耦合性降低,互不影響,一個函數出現問題了,也不會對另外一個函式造成很大的影響。
任務量固定用普通的程序,任務數不固定,或者量大,用程序池,程序池會自己管理,能重複利用,不用去管。
def test1(): while True: print('......') time.sleep(1) def test2(): while True: print('......') time.sleep(1) def main(): p1 = multiprocessing.Process(target=test1) #通過multiprocessing模組裡面的一個類建立了一個物件 p2 = multiprocessing.Process(target=test2) p1.start() p2.start() ##多程序完成佇列之間的通訊 def download_from_web(q): #模擬從網上下載資料 data = [11,12,13] #向佇列中寫入數 for temp in data: q.put(temp) print("已把資料傳入到佇列中") def analysis_data(q): shuju = list() #列表和寫[]一樣 while True: data = q.get() shuju.append(data) if q.empty(): break print(shuju) """處理資料""" def main(): #1.建立一個佇列 q = multiprocessing.Queue(3) #如果裡面不寫多少個佇列預設是最大,這個看你記憶體 #2.建立多個程序,將佇列的引用當做實參進行傳遞到裡面 p1 = multiprocessing.Process(target=download_from_web,args=(q,)) #把隊列當做一個實參傳進去 p2 = multiprocessing.Process(target=analysis_data,args=(q,)) p1.start() p2.start() ##程序池 if __name__ == '__main__': main()