欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Python并發(fā)編程的幾種實現(xiàn)方式

 更新時間:2024年10月05日 08:58:19   作者:一點sir  
Python并發(fā)編程讓程序能同時執(zhí)行多個任務(wù),Python提供多種并發(fā)實現(xiàn)方式,包括多線程、多進(jìn)程、異步編程等,多線程受全局解釋器鎖(GIL)影響,在CPU密集型任務(wù)上不提升性能,但適合I/O密集型任務(wù),多進(jìn)程適用于CPU密集型任務(wù)

Python 并發(fā)編程是指在 Python 中編寫能夠同時執(zhí)行多個任務(wù)的程序。并發(fā)編程在任何一門語言當(dāng)中都是比較難的,因為會涉及各種各樣的問題,在Python當(dāng)中也不例外。Python 提供了多種方式來實現(xiàn)并發(fā),包括多線程(threading)、多進(jìn)程(multiprocessing)、異步編程(asyncio),以及一些高級用法concurrent.futures和第三方庫如gevent。

多線程 (Threading)

多線程是通過使用 threading 模塊來創(chuàng)建和管理線程。線程是輕量級的過程,可以與同一進(jìn)程中的其他線程共享數(shù)據(jù)和資源。然而,由于 Python 的全局解釋器鎖(GIL)的存在,如果用的解釋器是CPython的話,那么多線程在 CPU 密集型任務(wù)上不會有性能提升的,但是IO密集型的是會有的。

import threading
import time

def worker(num):
    print(f"Worker {num} starting")
    time.sleep(2)
    print(f"Worker {num} finished")

threads = []
for i in range(5):
    t = threading.Thread(target=worker, args=(i,))
    threads.append(t)
    t.start()

# Wait for all threads to complete
for t in threads:
    t.join()
print("All workers finished.")

上面的例子中,通過threading模塊中的Thread啟動了另一個線程,輸出中首先出現(xiàn)的是每個線程的啟動消息,如 "Worker 0 starting",然后是 "Worker 1 starting" 等等。
接下來是每個線程的完成消息,如 "Worker 0 finished"。由于線程的執(zhí)行順序不是固定的,因此實際輸出中的線程完成順序可能會有所不同。

全局解釋器鎖(GIL)是歷史歷史遺留下來的問題,在Python3.13可能會得到解決。

多進(jìn)程 (Multiprocessing)

多進(jìn)程則可以通過使用 multiprocessing 模塊來創(chuàng)建獨立的進(jìn)程。每個進(jìn)程都有自己的內(nèi)存空間,因此可以繞過 GIL,適用于 CPU 密集型任務(wù)。

from multiprocessing import Process
import time

def worker(num):
    print(f"Worker {num} starting")
    time.sleep(2)
    print(f"Worker {num} finished")

processes = []
for i in range(5):
    p = Process(target=worker, args=(i,))
    processes.append(p)
    p.start()

# Wait for all processes to complete
for p in processes:
    p.join()
print("All workers finished.")

多進(jìn)程與多線程示例類似,但這里是在不同的進(jìn)程中執(zhí)行。通過multiprocessing模塊中的Process啟動了另一個進(jìn)程,每個進(jìn)程開始和完成的消息按順序出現(xiàn)。由于進(jìn)程之間沒有共享內(nèi)存,每個進(jìn)程都在獨立的環(huán)境中運行,因此輸出中的完成順序與啟動順序相同。

異步編程 (Asyncio)

Python 3.4 引入了 asyncio 模塊,它是一個用于編寫單線程并發(fā)代碼的模塊,使用 async 和 await 關(guān)鍵字。異步編程允許你編寫并發(fā)代碼,以非阻塞的方式運行。這非常適合 I/O 密集型任務(wù),如網(wǎng)絡(luò)請求、文件操作等。

import asyncio

async def worker(num):
    print(f"Worker {num} starting")
    await asyncio.sleep(2)
    print(f"Worker {num} finished")

async def main():
    tasks = [worker(i) for i in range(5)]
    await asyncio.gather(*tasks)

asyncio.run(main())
print("All workers finished.")

由于協(xié)程是基于事件循環(huán)的,因此輸出中的完成順序可能與啟動順序不同。異步編程也是python并發(fā)編程中比較重要的一個概念,后面很大篇幅都要圍繞這個異步編程來展開的。

使用 concurrent.futures

concurrent.futures 提供了一個高層次的接口來處理并行執(zhí)行的任務(wù),實際上就是線程池或者進(jìn)程池的玩意,這個池的概念就是線程或者進(jìn)程用完不銷毀,重復(fù)利用,具體后面展開說說。

示例

from concurrent.futures import ThreadPoolExecutor, ProcessPoolExecutor
import time

def worker(num):
    print(f"Worker {num} starting")
    time.sleep(2)
    return f"Worker {num} finished"

with ThreadPoolExecutor(max_workers=5) as executor:
    futures = [executor.submit(worker, i) for i in range(5)]

for future in futures:
    print(future.result())

print("All workers finished.")

首先,創(chuàng)建了一個最大容納 5 個工作線程的線程池。然后,提交了 5 個 worker 任務(wù)到線程池中,并立即返回了 5 個 Future 對象。接著,程序遍歷這些 Future 對象,等待每個任務(wù)完成,并打印它們的返回值。最后,打印所有工作線程已經(jīng)完成的消息。不過還是那個問題,由于 Python 的全局解釋器鎖(GIL),在 CPU 密集型任務(wù)中,線程池并不會帶來性能上的提升。

以上這些方法都可以根據(jù)你的具體需求來選擇使用。如果你需要進(jìn)行更多的細(xì)節(jié)控制或者有特定的性能要求,你還可以考慮使用更底層的 API 或者第三方庫。

到此這篇關(guān)于Python并發(fā)編程的幾種實現(xiàn)方式的文章就介紹到這了,更多相關(guān)Python并發(fā)編程的實現(xiàn)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Python批量處理工作簿和工作表的實現(xiàn)示例

    Python批量處理工作簿和工作表的實現(xiàn)示例

    本文主要介紹了使用Python批量處理工作簿和工作表,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • Python實現(xiàn)讀取郵箱中的郵件功能示例【含文本及附件】

    Python實現(xiàn)讀取郵箱中的郵件功能示例【含文本及附件】

    這篇文章主要介紹了Python實現(xiàn)讀取郵箱中的郵件功能,可讀取郵件文本及附件的功能,涉及Python針對郵件的獲取、分析、保存等相關(guān)操作技巧,需要的朋友可以參考下
    2017-08-08
  • 基于Python實現(xiàn)千圖成像工具的示例代碼

    基于Python實現(xiàn)千圖成像工具的示例代碼

    千圖成像也就是用N張圖片組成一張圖片的效果。這篇文章將利用Python語言編寫一個簡單的千圖成像工具,感興趣的小伙伴可以了解一下
    2022-07-07
  • 解讀opencv中cv2.imread()返回值為None問題及解決

    解讀opencv中cv2.imread()返回值為None問題及解決

    這篇文章主要介紹了解讀opencv中cv2.imread()返回值為None問題及解決,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • pandas數(shù)據(jù)處理清洗實現(xiàn)中文地址拆分案例

    pandas數(shù)據(jù)處理清洗實現(xiàn)中文地址拆分案例

    因為后續(xù)數(shù)據(jù)分析工作需要用到地理維度進(jìn)行分析,所以需要把login_place字段進(jìn)行拆分成:國家、省份、地區(qū)。感興趣的可以了解一下
    2021-06-06
  • Docker如何部署Python項目的實現(xiàn)詳解

    Docker如何部署Python項目的實現(xiàn)詳解

    這篇文章主要介紹了Docker如何部署Python項目的實現(xiàn)詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-10-10
  • Python通過wordcloud庫實現(xiàn)將單詞生成詞云

    Python通過wordcloud庫實現(xiàn)將單詞生成詞云

    Python的wordcloud庫是一個用于生成詞云的Python包,它可以將一段文本中出現(xiàn)頻率高的單詞按其出現(xiàn)頻率大小以及顏色深淺排列成一個詞云圖形,從而更好地展示文本中的信息,你可以使用wordcloud庫來生成各種類型的詞云,本文就介紹了如何生成心型詞云
    2023-06-06
  • python中的os.path.join使用方法詳解

    python中的os.path.join使用方法詳解

    這篇文章主要介紹了python中的os.path.join使用方法詳解,os.path.join用于將多個路徑拼接為一個完整路徑,經(jīng)常使用,但沒了解過細(xì)節(jié),直到今天遇到一個令人疑惑的問題,最后發(fā)現(xiàn)是os.path.join的問題,借此機(jī)會,記錄下os.path.join的用法,需要的朋友可以參考下
    2023-11-11
  • Python pytest裝飾器總結(jié)(實例詳解)

    Python pytest裝飾器總結(jié)(實例詳解)

    這篇文章主要介紹了Python pytest裝飾器總結(jié),本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-04-04
  • 詳解Python中的上下文管理器原理

    詳解Python中的上下文管理器原理

    這篇文章主要為大家詳細(xì)介紹了Python中的上下文管理器的原理與使用,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-03-03

最新評論