歡迎關(guān)注博主 Mindtechnist 或加入【智能科技社區(qū)】一起學(xué)習(xí)和分享Linux、C、C++、Python、Matlab,機器人運動控制、多機器人協(xié)作,智能優(yōu)化算法,濾波估計、多傳感器信息融合,機器學(xué)習(xí),人工智能等相關(guān)領(lǐng)域的知識和技術(shù)。搜索關(guān)注公粽號 《機器和智能》 發(fā)送關(guān)鍵詞“刷題寶典”即可領(lǐng)取技術(shù)大禮包!
博主介紹:
CSDN優(yōu)質(zhì)創(chuàng)作者,CSDN實力新星,CSDN內(nèi)容合伙人;
阿里云社區(qū)專家博主;
華為云社區(qū)云享專家;
51CTO社區(qū)入駐博主,掘金社區(qū)入駐博主,支付寶社區(qū)入駐博主,博客園博主。
專欄:《前沿技術(shù)文獻與圖書推薦》
隨著計算機技術(shù)的不斷發(fā)展,對于高并發(fā)處理的需求也越來越迫切。在現(xiàn)代網(wǎng)絡(luò)應(yīng)用中,高并發(fā)是一個普遍存在的挑戰(zhàn),而Python作為一門流行的編程語言,其在高并發(fā)處理方面也吸引著越來越多的關(guān)注。在本博客中,我們將探討Python高并發(fā)編程的核心概念和實現(xiàn)方法,主要著重于異步IO和多線程并發(fā)。
什么是高并發(fā)?
在開始之前,我們先來明確一下什么是高并發(fā)。高并發(fā)指的是系統(tǒng)能夠同時處理大量并發(fā)請求的能力。在網(wǎng)絡(luò)應(yīng)用中,這些請求可以是來自不同用戶的網(wǎng)頁訪問、API請求或者其他需要處理的任務(wù)。
要理解高并發(fā),我們需要關(guān)注系統(tǒng)的性能指標(biāo),比如響應(yīng)時間、吞吐量和并發(fā)用戶數(shù)。響應(yīng)時間是指從請求發(fā)出到收到響應(yīng)的時間,吞吐量表示單位時間內(nèi)能夠處理的請求數(shù)量,而并發(fā)用戶數(shù)是指同時處理的請求數(shù)量。
異步IO實現(xiàn)高并發(fā)
Python提供了異步IO編程的支持,通過使用asyncio庫,我們可以實現(xiàn)高并發(fā)處理。異步IO允許我們在等待某些IO操作完成時,能夠繼續(xù)處理其他任務(wù),從而提高了程序的效率。
async/await語法
在使用asyncio之前,我們需要了解async和await這兩個關(guān)鍵字。async用于定義一個異步函數(shù),而await用于等待一個異步操作完成。
讓我們來看一個簡單的例子,使用asyncio實現(xiàn)一個異步的網(wǎng)絡(luò)請求:
import asyncio
async def fetch_data(url):
print(f"Fetching data from {url}")
await asyncio.sleep(3) # 模擬網(wǎng)絡(luò)請求延遲
print(f"Data received from {url}")
async def main():
task1 = fetch_data("https://example.com")
task2 = fetch_data("https://api.example.com")
await asyncio.gather(task1, task2)
asyncio.run(main())
在上面的例子中,fetch_data函數(shù)模擬了一個網(wǎng)絡(luò)請求,然后使用asyncio.sleep來模擬網(wǎng)絡(luò)請求的延遲。在main函數(shù)中,我們創(chuàng)建了兩個fetch_data任務(wù),并使用asyncio.gather來同時運行這兩個任務(wù)。
使用異步IO處理高并發(fā)
異步IO真正發(fā)揮威力的地方是在處理大量并發(fā)請求時??紤]一個常見的應(yīng)用場景:同時向多個網(wǎng)站發(fā)送請求并等待結(jié)果返回。使用傳統(tǒng)的同步IO方法,我們將不得不一個接一個地等待每個請求的返回,效率會很低。
現(xiàn)在,我們將使用異步IO實現(xiàn)高并發(fā)請求處理。假設(shè)我們有一個包含多個URL的列表,我們將使用asyncio.gather同時發(fā)送這些請求并等待所有請求返回:
import asyncio
async def fetch_data(url):
print(f"Fetching data from {url}")
await asyncio.sleep(3) # 模擬網(wǎng)絡(luò)請求延遲
print(f"Data received from {url}")
async def main():
urls = [
"https://example.com",
"https://api.example.com",
"https://test.example.com"
]
tasks = [fetch_data(url) for url in urls]
await asyncio.gather(*tasks)
asyncio.run(main())
在這個例子中,我們將URL列表傳遞給main函數(shù),并為每個URL創(chuàng)建一個fetch_data任務(wù)。然后,使用asyncio.gather并傳入*tasks來同時運行所有任務(wù)。這樣,我們的程序可以在一個任務(wù)等待網(wǎng)絡(luò)請求返回的同時,繼續(xù)處理其他任務(wù),從而實現(xiàn)高并發(fā)請求處理。
異步IO的編程模型對于高并發(fā)場景非常有用,但并不是所有情況都適用。在某些情況下,多線程并發(fā)可能更適合。
多線程并發(fā)編程
Python的多線程模塊threading允許我們使用多個線程來實現(xiàn)并發(fā)。每個線程都可以執(zhí)行不同的任務(wù),從而在多核處理器上利用多個CPU核心。多線程并發(fā)在某些情況下可以實現(xiàn)更好的性能,特別是當(dāng)我們的程序涉及CPU密集型任務(wù)時。
然而,需要注意的是,Python的全局解釋器鎖(Global Interpreter Lock,GIL)在某種程度上限制了多線程的并發(fā)能力。GIL確保了在同一時刻只有一個線程可以執(zhí)行Python字節(jié)碼。這意味著對于CPU密集型任務(wù),多線程并不能真正實現(xiàn)并行執(zhí)行。但在IO密集型任務(wù)中,由于大部分時間線程都在等待IO操作,多線程并發(fā)仍然可以帶來明顯的性能提升。
使用threading模塊
讓我們來看一個簡單的例子,使用threading模塊實現(xiàn)多線程并發(fā):
import threading
import time
def task(name):
print(f"Task {name} started")
time.sleep(3) # 模擬任務(wù)執(zhí)行時間
print(f"Task {name} completed")
def main():
threads = []
for i in range(3):
t = threading.Thread(target=task, args=(f"Thread-{i}",))
threads.append(t)
t.start()
for t in threads:
t.join()
if __name__ == "__main__":
main()
當(dāng)處理IO密集型任務(wù)時,多線程并發(fā)下載圖片可以提高效率。在這個示例中,我們使用requests庫來發(fā)送HTTP請求并下載圖片。
import threading
import requests
def download_image(url, filename):
response = requests.get(url)
with open(filename, "wb") as f:
f.write(response.content)
print(f"Downloaded image from {url} and saved as {filename}")
def main():
image_urls = [
"https://example.com/image1.jpg",
"https://example.com/image2.jpg",
"https://example.com/image3.jpg",
"https://example.com/image4.jpg",
"https://example.com/image5.jpg"
]
threads = []
for i, url in enumerate(image_urls):
filename = f"image{i+1}.jpg"
thread = threading.Thread(target=download_image, args=(url, filename))
threads.append(thread)
thread.start()
for thread in threads:
thread.join()
if __name__ == "__main__":
main()
在上面的示例中,我們定義了一個download_image函數(shù),它接受一個圖片的URL和要保存的文件名,然后發(fā)送HTTP請求并將圖片保存到本地。在main函數(shù)中,我們創(chuàng)建了包含多個下載線程的列表threads,然后啟動每個線程來下載圖片。最后,我們使用thread.join()來等待所有線程完成下載。
需要注意的是,多線程下載圖片在這個示例中是非常適用的,因為下載圖片是一個IO密集型任務(wù)。但如果下載圖片的任務(wù)同時涉及大量CPU計算,那么多線程可能會受到GIL的限制,從而無法真正實現(xiàn)并行處理。在這種情況下,我們可以考慮使用多進程并發(fā)來規(guī)避GIL的限制。
異步IO vs. 多線程并發(fā)
在Python高并發(fā)編程中,我們常常需要在異步IO和多線程并發(fā)之間做出選擇。雖然它們都可以提高程序的并發(fā)性能,但在不同的場景下有各自的優(yōu)勢和適用性。
異步IO的優(yōu)勢
高并發(fā)處理:異步IO能夠高效處理大量的IO密集型任務(wù),充分利用等待IO操作完成的空閑時間,執(zhí)行其他任務(wù)。
資源高效:相比多線程并發(fā),異步IO的開銷較小,不需要創(chuàng)建多個線程,因此資源利用更高效。
簡化編程模型:使用await關(guān)鍵字,編寫異步IO代碼相對于傳統(tǒng)的回調(diào)方式更加直觀和易于維護。
多線程并發(fā)的優(yōu)勢
并行計算:多線程并發(fā)可以在多核CPU上實現(xiàn)并行計算,處理CPU密集型任務(wù)。
多任務(wù)處理:多線程并發(fā)可以同時處理多個任務(wù),適用于需要同時執(zhí)行多個任務(wù)的場景。
多核利用:在某些情況下,多線程并發(fā)可以更好地利用多核CPU,提高計算性能。
適用場景選擇
如果任務(wù)是IO密集型的,比如網(wǎng)絡(luò)請求、數(shù)據(jù)庫讀寫等,那么異步IO是更合適的選擇。異步IO可以高效地處理大量IO任務(wù),節(jié)省資源和時間。
如果任務(wù)是CPU密集型的,并且不受GIL的影響,那么多線程并發(fā)可能是更好的選擇。多線程并發(fā)可以實現(xiàn)并行計算,充分利用多核CPU。
如果任務(wù)同時涉及大量IO和CPU計算,并且需要利用多核CPU進行并行計算,那么多進程并發(fā)可能是更好的選擇。
綜上所述,根據(jù)任務(wù)的特點和需求,我們可以靈活選擇合適的高并發(fā)編程方式,以達到最優(yōu)的性能。
圖書推薦與送書活動
??《Python高并發(fā)與高性能編程:原理與實踐》
Python成為時下技術(shù)革新的弄潮兒,全民Python的發(fā)展趨勢讓人們不再滿足于簡單地運行Python程序,逐步探索其更為廣泛的日常應(yīng)用和高性能設(shè)計。以ChatGPT為代表的大模型產(chǎn)品對初級程序開發(fā)人員提出了挑戰(zhàn),要想在開發(fā)領(lǐng)域站穩(wěn)腳跟、有發(fā)展,必須掌握更高級的技巧和能力。
對于Python開發(fā)人員來說,高并發(fā)、高性能開發(fā)無疑是未來必須走的進階之路。
目前,市面上關(guān)于Java高并發(fā)、高性能的書很多,講解Python基本語法和常規(guī)使用的書也很多,但很少有專門針對Python高并發(fā)、高性能從實現(xiàn)原理到實踐應(yīng)用系統(tǒng)性講解的書。鑒于此,筆者決定結(jié)合自己的經(jīng)驗對Python語言中的高級編程部分(即高并發(fā)、高性能編程的核心實現(xiàn)原理與實踐應(yīng)用)進行剖析,以幫助希望成為Python 高級工程師的你們。
書名:《Python高并發(fā)與高性能編程:原理與實踐》
作者:周宇凡(Steafan)
出版社:北京大學(xué)出版社
內(nèi)容簡介:
《Python高并發(fā)與高性能編程:原理與實踐》是一本幫助Python初級碼農(nóng)向高手進階的專業(yè)指導(dǎo)書,可幫助所有Python從業(yè)者擺脫因ChatGPT等產(chǎn)品帶來的職業(yè)危機。
書中不僅對Python必備基礎(chǔ)知識進行了解讀,對所有的Python高級特性進行原理級剖析,還囊括了大量指導(dǎo)實踐的內(nèi)容,可以幫助讀者真正實現(xiàn)高并發(fā)、高性能編程。
本書從Python高級基礎(chǔ)知識開始,逐步介紹高并發(fā)概念在Python語言中的實現(xiàn)過程、高性能特性是如何在Python語言中實現(xiàn)的,最后結(jié)合本書作者真實的項目經(jīng)驗,應(yīng)用Python高并發(fā)、高性能特性來解決真實項目開發(fā)過程中遇到的問題和優(yōu)化項。
本書主要介紹Python高并發(fā)、高性能編程的核心實現(xiàn)原理與代碼實現(xiàn),具體包括如下內(nèi)容。
- Python高并發(fā)、高性能編程的步驟和規(guī)范。
- 與Python高并發(fā)、高性能編程相關(guān)的核心實現(xiàn)原理。
- 與Python高并發(fā)、高性能編程相關(guān)的特性在當(dāng)下主流的Python解釋器或虛擬機CPython中的具體表現(xiàn)形式和內(nèi)存分配策略
??本次送1本書 ,評論區(qū)抽1位小伙伴送書
??活動時間:截止到 2023-07-30 10:00:00
??抽獎方式:利用爬蟲進行隨機抽獎。
??參與方式:關(guān)注博主、點贊、收藏,評論區(qū)評論 “人生苦短,我用python!”
?注意:一定要關(guān)注博主,不然中獎后將無效!
??通知方式:通過私信聯(lián)系中獎粉絲。
??提示:有任何疑問請私信公粽號 《機器和智能》文章來源:http://www.zghlxwxcb.cn/news/detail-609049.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-609049.html
到了這里,關(guān)于【文末送書】Python高并發(fā)編程:探索異步IO和多線程并發(fā)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!