日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > python >内容正文

python

python多线程和异步性能对比_python对比线程,进程,携程,异步,哪个快

發(fā)布時間:2024/7/5 python 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python多线程和异步性能对比_python对比线程,进程,携程,异步,哪个快 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

目錄

概念介紹

測試環(huán)境

開始測試

測試【單進(jìn)程單線程】

測試【多進(jìn)程 并行】

測試【多線程 并發(fā)】

測試【協(xié)程 + 異步】

結(jié)果對比

繪圖展示

概念介紹

首先簡單介紹幾個概念:

進(jìn)程和線程

進(jìn)程就是一個程序在一個數(shù)據(jù)集上的一次動態(tài)執(zhí)行過程(數(shù)據(jù)集是程序在執(zhí)行過程中所需要使用的資源)。

線程也叫輕量級進(jìn)程,它是一個基本的 CPU 執(zhí)行單元,是比進(jìn)程更小的能獨立運行的基本單位。

進(jìn)程和線程的關(guān)系:

一個線程只能屬于一個進(jìn)程,而一個進(jìn)程可以有多個線程,但至少有一個線程。

資源分配給進(jìn)程,同一進(jìn)程的所有線程共享該進(jìn)程的所有資源。

CPU 分給線程,即真正在 CPU 上運行的是線程。

并行和并發(fā)

并行處理是計算機系統(tǒng)中能同時執(zhí)行兩個或更多個處理的一種計算方法。并行處理可同時工作于同一程序的不同方面,其主要目的是節(jié)省大型和復(fù)雜問題的解決時間。

并發(fā)處理指一個時間段中有幾個程序都處于已啟動運行到運行完畢之間,且這幾個程序都是在同一個 CPU 上運行,但任一個時刻點上只有一個程序在 CPU 上運行。

并發(fā)的關(guān)鍵是你有處理多個任務(wù)的能力,不一定要同時。并行的關(guān)鍵是你有同時處理多個任務(wù)的能力。所以說,并行是并發(fā)的子集。多進(jìn)程是并行的,多線程是并發(fā)的。

同步和異步

同步就是指一個進(jìn)程在執(zhí)行某個請求的時候,若該請求需要一段時間才能返回信息,那么這個進(jìn)程將會一直等待下去,直到收到返回信息才繼續(xù)執(zhí)行下去。

異步是指進(jìn)程不需要一直等下去,而是繼續(xù)執(zhí)行下面的操作,不管其他進(jìn)程的狀態(tài)。當(dāng)有消息返回時系統(tǒng)會通知進(jìn)程進(jìn)行處理,這樣可以提高執(zhí)行的效率。

舉個例子,打電話時就是同步通信,發(fā)短息時就是異步通信。

測試環(huán)境

進(jìn)行對比測試之前,我們先來創(chuàng)建一個合適的實驗環(huán)境:

模擬一個需要等待一定時間才可以獲取返回結(jié)果的網(wǎng)頁。

如果直接用百度、CSDN 等站點的話,一方面響應(yīng)太快、難以看出各種方法的差距,另一方面響應(yīng)速度會受網(wǎng)速影響、每次發(fā)送請求獲取響應(yīng)所需的時間不完全一致導(dǎo)致重復(fù)實驗結(jié)果差距較大,所以在此用 Flask 模擬一個本地慢速服務(wù)器。

flask_server.py 代碼如下:

from flask import Flask # pip install flask

import time

app = Flask(__name__)

@app.route('/')

def index():

time.sleep(3) # 休眠 3 秒再返回結(jié)果

return 'Hello!'

if __name__ == '__main__':

app.run(threaded=True) # 以多線程模式啟動服務(wù)

啟動之后,Flask 服務(wù)默認(rèn)在 127.0.0.1:5000 上運行,控制臺輸出結(jié)果如下:

* Serving Flask app "flask_server" (lazy loading)

* Environment: production

WARNING: Do not use the development server in a production environment.

Use a production WSGI server instead.

* Debug mode: off

* Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)

在瀏覽器中訪問 http://127.0.0.1:5000/ 等待 3 秒即會出現(xiàn) Hello! 頁面,表明簡單的慢速服務(wù)器搭建完成!

開始測試

首先導(dǎo)入需要的模塊,以請求 10 次為例準(zhǔn)備 urls,再定義一個 get_html_text() 函數(shù):

import requests

import time

# 用于多進(jìn)程

from multiprocessing import Process

# 用于多線程

from threading import Thread

# 用于協(xié)程+異步

import asyncio

import aiohttp # pip install aiohttp

urls = ['http://127.0.0.1:5000' for _ in range(10)]

def get_html_text(url):

response = requests.get(url)

return response.text

測試【單進(jìn)程單線程】

start = time.time()

for url in urls:

result = get_html_text(url)

print(result)

end = time.time()

print('【單進(jìn)程單線程】耗時:%s 秒' %(end - start))

結(jié)果如下:

Hello!

Hello!

Hello!

Hello!

Hello!

Hello!

Hello!

Hello!

Hello!

Hello!

【單進(jìn)程單線程】耗時:30.15605854988098 秒

測試【多進(jìn)程 并行】

start = time.time()

processes = []

for url in urls:

p = Process(target=get_html_text, args=(url,))

processes.append(p)

p.start()

for p in processes:

p.join()

print('Hello!')

end = time.time()

print('【多進(jìn)程 并行】耗時:%s 秒' %(end - start))

結(jié)果如下(測試電腦為 4 核 CPU,核心數(shù)越大加速越明顯):

Hello!

Hello!

Hello!

Hello!

Hello!

Hello!

Hello!

Hello!

Hello!

Hello!

【多進(jìn)程 并行】耗時:5.511234283447266 秒

測試【多線程 并發(fā)】

start = time.time()

threads = []

for url in urls:

t = Thread(target=get_html_text, args=(url,))

threads.append(t)

t.start()

for t in threads:

t.join()

print('Hello!')

end = time.time()

print('【多線程 并發(fā)】耗時:%s 秒' %(end - start))

結(jié)果如下:

Hello!

Hello!

Hello!

Hello!

Hello!

Hello!

Hello!

Hello!

Hello!

Hello!

【多線程 并發(fā)】耗時:3.030653953552246 秒

測試【協(xié)程 + 異步】

# 因為 requests 模塊不支持異步操作,需要借助 aiohttp 模塊

async def get_html_text_async(url):

async with aiohttp.ClientSession() as session:

async with session.get(url) as response:

text = await response.text()

return text

start = time.time()

tasks = [asyncio.ensure_future(get_html_text_async(url)) for url in urls]

loop = asyncio.get_event_loop()

loop.run_until_complete(asyncio.wait(tasks))

for task in tasks:

print(task.result())

end = time.time()

print('【協(xié)程 ++ 異步】耗時:%s 秒' %(end - start))

結(jié)果如下:

Hello!

Hello!

Hello!

Hello!

Hello!

Hello!

Hello!

Hello!

Hello!

Hello!

【協(xié)程 ++ 異步】耗時:3.046288251876831 秒

結(jié)果對比

len(urls)==1:

單進(jìn)程單線程3。0078秒

多進(jìn)程 并發(fā) 3.83秒

多線程并發(fā)3.0073秒

攜程+異步3.0133

len(urls)==4:

單進(jìn)程單線程12秒

多進(jìn)程 并發(fā) 4秒

多線程并發(fā)3.01秒

攜程+異步3.02秒

len(urls)==10:

單進(jìn)程單線程30.1秒

多進(jìn)程 并發(fā) 5.5秒

多線程并發(fā)3.030秒

攜程+異步3.046秒

len(urls)==100:

單進(jìn)程單線程301.10秒

多進(jìn)程 并發(fā) 23.81秒

多線程并發(fā)3.15秒

攜程+異步3.19秒

總結(jié)

以上是生活随笔為你收集整理的python多线程和异步性能对比_python对比线程,进程,携程,异步,哪个快的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。