中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

python中多進程與多線程的用法及場景分析

發布時間:2022-01-04 17:03:28 來源:億速云 閱讀:203 作者:柒染 欄目:大數據

python中多進程與多線程的用法及場景分析,很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。

【寫在前面】

        剛開始學習Python 并發查詢或者并發讀寫時,看到大神們說,多線程是python的雞肋,要學就學多進程。好吧,我連多線程怎么寫都不知道呢。

        因此,就寫了以下的示例代碼。代碼目的是將test.txt文件中的內容,以并發的方式(多線程/多進程)進行寫入新文件中,以此來驗證兩種并發方式的效率。

【示例代碼】

# coding=utf-8# @Auther : "鵬哥賊優秀"# @Date : 2019/8/10# @Software : PyCharm 
from multiprocessing import Poolimport timeimport threading
# 多進程的寫數據方法def writedata(content):    with open("new1.txt", "a") as f:        f.writelines(content)        # 定義自己的多線程繼承類class myThread(threading.Thread):    # 聲明myThread是多線程的繼承類    def __init__(self, content):        threading.Thread.__init__(self)        self.content = content        # 多線程運行的內容    def run(self):        threadingLock = threading.Lock()        threadingLock.acquire()        self.my_writedata(self.content)        threadingLock.release()            # 多線程的寫數據方法    def my_writedata(self, content):        with open("new2.txt", "a") as f:            f.writelines(content)
if __name__ == "__main__":    # 創建一個test.txt,用于數據讀取后的寫入    with open("test.txt","w")as f_w:        for i in range(1000):            f_w.write(str(i)+"\n")    # 多進程讀寫    print("開始計時(多進程寫入)")    t0 = time.time()    with open("test.txt", "r", encoding="utf-8")as f:        content = f.readlines()    pool = Pool(processes=4)    pool.map_async(writedata(content), range(len(content)))    pool.close()    pool.join()    t1 = time.time()    print("完成時間為:{0}".format(t1 - t0))    # 多線程讀寫    print("開始計時(多線程寫入)")    t2 = time.time()    with open("test.txt", "r", encoding="utf-8")as f:        content = f.readlines()    threads = []    threadnum = 4    eline = len(content) // threadnum    for i in range(threadnum):        threadtemp = myThread(content[i * eline:(i + 1) * eline])        threadtemp.start()        threads.append(threadtemp)    for i in threads:        i.join()    t3 = time.time()    print("完成時間為:{0}".format(t3 - t2))

【效果】

python中多進程與多線程的用法及場景分析

(第一個是多進程,我開始的時候打錯字了。)

【知識點】

1、多進程 代碼流程:

(1)創建進程池,并明確進程數。這里我用的是4個進程,是因為我本地PC機的CPU核是4個。查詢方法:

multiprocessing.cpu_count() 即可知道核數了

(2)將具體要執行的方法加入到進程池的異常(map_async)處理中。當然也可以用map方法。其中,map_async方法里需要 2個參數,一個是具體要執行的函數,一個是表示循環執行的次數,類型是個list。示例代碼中,因為每次wirtedata是只寫了content的一行,因此一共要寫len(content)次

(3)最后就是進程池后的關閉,并且在子進程關閉后,主程序才繼續往下執行。join()方法無論 是對多線程不是多進程,用途是一樣的。

從代碼實現上,個人覺得多進程流程簡單明了,并且各進程之間寫數據是順序的,不會像多線程因為GIL的隨機問題導致進程順序混亂的問題。但是唯一的問題是,寫時間是有點長。

2、多線程代碼流程:

       本文采用的是繼承threading類的方法,即需要重構run方法。個人覺得這種方式,層次更加清晰,而且能根據自己的目的靈活重構run方法。下面重點介紹這種方法。

(1)定義一個繼承threading類的對象,然后重構run方法。其中run方法,需要考慮到鎖的問題。為什么要考慮鎖呢?因為存在多個線程同時寫文件的情況,如果不加鎖,就會出現多個線程同時寫相同一條數據的情況,導致出現臟數據。

run方法的重構也很簡單,先加鎖,再加入自己想要的函數,最后解鎖。

(2)mythread類的編寫,我還是很快就學會了,但問題是如何將test.txt讓多線程寫入。

一開始,我是這么寫的:

for i in range(threadnum):

    threadtemp = myThread(content)

    threadtemp.start()

    threads.append(threadtemp)

發現每個線程都重復將test.txt里的內容都寫了一次,也是相當于重復寫了4次。這里就是和多進程用法不同的地方了。

【說明】:

多進程,由于不共享資源,因此每個進程都能讀取到不同的content內容;多線程,線程之間相互共享,如果要它實現并發的功能,必須給每個線程指定要寫的內容。因此最后示例代碼中我就通過 content[i * eline:(i + 1) * eline]給每個線程指定了不同的寫入內容。

(3)在主函數中,需要把各線程進行start,最后就是等各子線程結束后,主線程再往下執行。

從最后代碼行上來看,個人覺得多線程其實是麻煩點的。另外,還有個麻煩的地方是:多線程在調用時是隨機調用的,什么意思?就是thread1結束后,第二個運行的是thread9,而不是thread2。那么問題來了,既然大神建議我們用多進程,而且多進程寫起來簡單,那是不是所有場景都使用多進程呢?

3、多線程和多進程的使用場景:

多線程使用場景:IO操作密集的場景,比如爬蟲,web訪問等,需要頻繁從網絡、硬盤、內存等讀寫數據。這種情況 下,因為單線程下的IO操作會有IO等待,造成不必要的時間浪費,因此采用多線程就能在線程A等待時,開啟線程B的操作。

多進程使用場景:CPU計算密集的場景,比如科學計算、循環處理等。這些場景因為計算工作量大,可能會出現單線程超時釋放GIL,從而 引發其他多個線程的搶奪,反而效果不好。

那為什么大神們說最好用多進程呢?應該是為了充分利用多核CPU,不然我們的PC機都要買多核CPU呢?

再回到本示例代碼,從結果上來看,是多線程的效率更快些,也說明硬盤讀寫的場景更建議用多線程;但是多線程的結果,即new2.txt里是亂序的,哎。不過我覺得應該有辦法解決的,但本人下次再學習。

看完上述內容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注億速云行業資訊頻道,感謝您對億速云的支持。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

株洲县| 乌鲁木齐市| 中卫市| 汾西县| 尤溪县| 蕉岭县| 荥阳市| 高淳县| 阳泉市| 扎兰屯市| 襄城县| 道孚县| 南宁市| 琼结县| 东方市| 金华市| 沭阳县| 鸡西市| 连州市| 龙口市| 九龙坡区| 罗平县| 麻栗坡县| 崇文区| 凤城市| 吉林市| 江永县| 紫金县| 永泰县| 浦北县| 西峡县| 慈溪市| 巩留县| 仲巴县| 彝良县| 伊川县| 安泽县| 华蓥市| 灵璧县| 岳普湖县| 沾益县|