1. 程式人生 > >Python學習多程序併發寫入同一檔案

Python學習多程序併發寫入同一檔案

最近學習了Python的多程序,想到我的高德API爬蟲那個爬取讀寫速度我就心累,實在是慢,看到多程序可以充分利用CPU核數我就開始完善我的程式碼,不過過程是艱辛的,在此之中出現了很多問題,其中最大的問題是爬取的資料是正確的,但是讀寫到Excel中卻開啟是空,想了半天也沒解決,腦子笨沒辦法,不過我回想到多程序中不同程序是相互獨立即

在多個程序下把資料寫入同一檔案由於是併發進行作業系統中會不清楚到底要寫入哪個資料到檔案中,所以會出現資源競爭混亂,導致檔案內容出現空,具體思路如下

具體思路跟把檔案輸出集中在一起也差不多,就是把程序需要寫入檔案的內容作為返回值返回給惠和的回撥函式,使用回撥函式向檔案中寫入內容。

就是這麼簡單。

apply_async(func[, args[, kwds[, callback[, error_callback]]]])

apply()方法的一個變體,它返回一個結果物件。

如果指定callback,那麼它應該是一個可接受單個引數的可呼叫物件。當結果完成時就對它應用callback,在呼叫失敗的情況下則應用error_callback。

如果指定error_callback,那麼它應該是一個接受單個引數的可呼叫物件。如果目標函式失敗,則以該異常例項呼叫error_callback。

回撥應該立即完成,否則處理結果的執行緒將被阻塞。


這是apply_async的用法中文文件,其中我們的回撥函式的定義就是callback這,文字分析無用,這裡我引用別的程式碼來講解:


import csv
from multiprocessing import Pool #匯入程序池
import datetime

def mycallback(x):
    print(x)
    csv_write.writerow(x)  

def sayHi(num):
    w = [str(num), str(num+1), str(num+2)]
    return w
    
if __name__ == '__main__':
    e1 = datetime.datetime.now()
    csv_file = open('Text.csv', 'w')
    csv_write = csv.writer(csv_file)
    p = Pool(4)
    
    for i in range(10):
        p.apply_async(sayHi, (i,),callback=mycallback)#sayHi是我們程序執行的物件,callback=mycallback這裡是當
	sayHi執行完後的回撥函式這裡需要注意,calback是單引數就是不能有2個引數以上,且sayHi(即多程序的執行的函式)
	必須有return 的返回值且是單個值不能有多個.

    
    p.close()
    p.join()
    e2 = datetime.datetime.now()
    print((e2-e1)) 
    csv_file.close()