Python學習多進程併發寫入同一文件

轉自:https://blog.csdn.net/Kompany4/article/details/78107619

最近學習了Python的多進程,想到我的高德API爬蟲那個爬取讀寫速度我就心累,實在是慢,看到多進程可以充分利用CPU核數我就開始完善我的代碼,不過過程是艱辛的,在此之中出現了很多問題,其中最大的問題是爬取的數據是正確的,但是讀寫到Excel中卻打開是空,想了半天也沒解決,腦子笨沒辦法,不過我回想到多進程中不同進程是相互獨立,即在多個進程下把數據寫入同一文件由於是併發進行操作系統中會不清楚到底要寫入哪個數據到文件中,所以會出現資源競爭混亂,導致文件內容出現空。

具體思路跟把文件輸出集中在一起也差不多,就是把進程需要寫入文件的內容作爲返回值返回給惠和的回調函數,使用回調函數向文件中寫入內容。

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

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

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

如果指定error_callback,那麼它應該是一個接受單個參數的可調用對象。如果目標函數失敗,則以該異常實例調用error_callback。

回調應該立即完成,否則處理結果的線程將被阻塞。

這是apply_async的用法中文文檔,其中我們的回調函數的定義就是callback這,文字分析無用:

#coding: utf-8

from multiprocessing import Pool
import time
import random

def mycallback(x):
    print str(x)
    with open('muti_process_log.txt', 'a+') as f:
        f.writelines('%d, \n' % x)

def sayHi(num):
    time.sleep(random.random()) #random.random()隨機生成0-1之間的小數
    return num

if __name__ == '__main__':
    start = time.time()
    pool = Pool(100)
    for i in range(100):
        pool.apply_async(sayHi, (i,), callback=mycallback)
    pool.close()
    pool.join()
    stop = time.time()
    print 'delay: %.3fs' % (stop - start) 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章