python中的併發是同時發生的事情由執行緒,任務,程序呼叫(實際上還是按順序執行的一系列指令)。巨集觀上看,執行緒,任務和程序是相同的,細節上她們代表不同的東西。事實上只有多程序在同一時間執行著多個任務,執行緒和非同步都在單個處理器執行,即一次只能處理乙個任務。
先佔式多工法:作業系統知道每個執行緒,並且可以隨時中斷該執行緒後執行別的執行緒,即對執行緒進行切換。執行緒的切換可以發生在單個python語句裡,在任何時候都可能需要進行任務切換。
多核cpu的並行,通過多程序,python建立新的程序(一半來說電腦幾核就開幾個程序)。每乙個程序可以被看做是乙個完全不同的程式,每乙個程序都在自己的python直譯器中執行。
併發在cpu繫結和io繫結問題上有很大影響,因為需要等待外部資源的輸入輸出或者程式處理的是比cpu慢得多的東西(通常是檔案系統和網路連線)。在程式裡新增併發性會增加額外的**和複雜性,需在確定加速之前評估是否值得這樣做。如不好的架構會導致併發或並行無法發揮加速作用,而推倒重來很多時候不允許。
多執行緒新增例項,以網路訪問為例子
未新增多執行緒的程式:
import requests
import time
def download_site(url,session):
with session.get(url) as response:
print(f"read from ")
def download_all_sites(sites):
with requests.session() as session:
for url in sites:
download_site(url,session)
if __name__ == '__main__':
sites=["","",]*40
start_time=time.time()
download_all_sites(sites)
duration=time.time()-start_time
print(f"downloaded in seconds")
執行結果如下:
新增多執行緒後的**:
import concurrent.futures
import threading
import requests
import time
thread_local=threading.local()
def get_session():
if not getattr(thread_local,"session",none):
thread_local.session=requests.session()
return thread_local.session
def download_site(url,session):
session=get_session()
with session.get(url) as response:
print(f"read from ")
def download_all_sites(sites):
with concurrent.futures.threadpoolexecutor(max_workers=5) as executor:
executor.map(download_site,sites)
if __name__ == '__main__':
sites=["","",]*40
start_time=time.time()
download_all_sites(sites)
duration=time.time()-start_time
print(f"downloaded in seconds")
執行結果:
第二節將講述非同步。
併發與並行
做併發程式設計之前,必須首先理解什麼是併發,什麼是並行,什麼是併發程式設計,什麼是並行程式設計。併發 concurrency 和並行 parallellism 是 解釋一 並行是指兩個或者多個事件在同一時刻發生 而併發是指兩個或多個事件在同一時間間隔發生。解釋二 並行是在不同實體上的多個事件,併發是...
併發與並行
併發性 concurrence 指兩個或兩個以上的事件或活動在同一時間間隔內發生。併發的實質是乙個物理cpu 也可以多個物理cpu 在若干道程式之間多路復用,併發性是對有限物理資源強制行使多使用者共享以提高效率。並行性 parallelism 指兩個或兩個以上事件或活動在同一時刻發生。在多道程式環境...
並行與併發
所有的併發處理都有排隊等候,喚醒,執行至少三個這樣的步驟.所以併發肯定是巨集觀概念,在微觀上他們都是序列被處理的,只不過資源不會在某乙個上被阻塞 一般是通過時間片輪轉 所以在巨集觀上看多個幾乎同時到達的請求同時在被處理。如果是同一時刻到達的請求也會根據優先順序的不同,而先後進入佇列排隊等候執行。併發...