python 中的併發與並行(一)

2021-09-25 01:45:35 字數 2013 閱讀 2604

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 指兩個或兩個以上事件或活動在同一時刻發生。在多道程式環境...

並行與併發

所有的併發處理都有排隊等候,喚醒,執行至少三個這樣的步驟.所以併發肯定是巨集觀概念,在微觀上他們都是序列被處理的,只不過資源不會在某乙個上被阻塞 一般是通過時間片輪轉 所以在巨集觀上看多個幾乎同時到達的請求同時在被處理。如果是同一時刻到達的請求也會根據優先順序的不同,而先後進入佇列排隊等候執行。併發...