1. 程式人生 > >python中的佇列,程序池

python中的佇列,程序池

爬蟲中的佇列能夠起到執行緒安全的作用,比如說一個執行緒訪問佇列中的資料的時候,另外一個執行緒就就能訪問了。這樣取資料就不會發生資料重複。但是列表就不可以了,列表你一個執行緒訪問列表裡面的資料,其他執行緒也可能會重複訪問這個資料,這樣拿出來的資料就有可能重複。即是佇列中的資料同一時刻只能被一個執行緒訪問,列表中的資料可能同一時刻可能被多個執行緒訪問,造成資料重複,不安全。

用佇列另外一個好處是可以解耦,可以讓兩個函式耦合性降低,互不影響,一個函數出現問題了,也不會對另外一個函式造成很大的影響。

任務量固定用普通的程序,任務數不固定,或者量大,用程序池,程序池會自己管理,能重複利用,不用去管。


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()