国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

爬蟲提速必備!用 asyncio 重寫你的 Python 爬蟲,效率爆炸!

開發
今天,我們就來聊聊 Python 解決這個痛點的核心機制——異步編程,以及它背后的三大支柱:async、await 和 asyncio 模塊!

在編程開發中,我們總是繞不開一個問題:如何高效地處理 I/O 密集型任務? 傳統的同步編程在遇到網絡請求、文件讀寫、數據庫查詢這些“慢操作”時,就像一個盡職盡責但效率低下的服務生,他必須站在原地等到一杯咖啡煮好,才能去處理下一個客人的需求。

這,就是阻塞(Blocking),是 CPU 資源的巨大浪費。

今天,我們就來聊聊 Python 解決這個痛點的核心機制——異步編程,以及它背后的三大支柱:async、await 和 asyncio 模塊!

一、為什么需要異步編程?

在解釋技術細節之前,我們先用一個簡單的場景來理解“同步”和“異步”的區別:

  • 同步(Sync): 就像你去咖啡店買咖啡。你點單后,就一直站在柜臺前等待咖啡師把你的咖啡做好,期間你什么也做不了。等你的咖啡好了,你才能去做下一件事。
  • 異步(Async): 就像你在咖啡店點完咖啡后,拿到一個取餐叫號器(一個未來的通知)。你就可以先找個位子坐下,看看書,甚至去隔壁商店轉一圈。當叫號器響了(通知你的任務完成了),你再去取咖啡。在等待咖啡的過程中,你的時間被充分利用了!

在編程中,同步代碼在執行耗時 I/O 操作時會阻塞整個線程,導致資源浪費。而異步編程就是為了解決這個“等待”的問題,讓程序在等待 I/O 完成時,可以切換去做其他有意義的事情,從而提高并發和吞吐量。

二、核心概念:asyncio、async 和 await

在 Python 里實現異步,主要依賴 asyncio 模塊,以及兩個關鍵字 async 和 await。

1. asyncio:異步編程的“發動機”

asyncio 是 Python 用于編寫單線程并發代碼的庫。它提供了事件循環(Event Loop)、網絡 I/O、子進程和并發運行協程等全套工具。簡單來說,它是 Python 異步編程的基礎設施。

2. 協程:可暫停的任務

協程,就是我們上面提到的那個“可以暫停”的任務。它不是線程也不是進程,它是一種比線程更輕量級的存在。

  • 定義: 協程是用戶級別的、可中斷的函數。它可以在執行過程中主動讓出控制權(暫停),并在需要時恢復執行。
  • 如何定義: 使用 async def 關鍵字定義的函數就是一個協程函數。調用它不會立即執行,而是返回一個協程對象。
# 協程函數
async def fetch_data(delay):
    """模擬一個耗時的網絡請求任務"""
    print(f"開始抓取數據,預計等待 {delay} 秒...")
    # await 暫停執行,等待操作完成
    await asyncio.sleep(delay) 
    print(f"數據抓取完成(耗時 {delay} 秒)")
    return f"Result after {delay} seconds"

3. async:我是一個異步函數/協程

async 關鍵字用于定義一個協程函數:async def function_name(...): 定義一個協程函數。調用這個函數會返回一個協程對象,而不是執行函數體。

4. await:請“暫停”,去等別人

await 關鍵字只能用在協程函數 (async def) 內部。它的作用是:

  • 暫停執行: 遇到 await 時,當前的協程會暫停執行,并將控制權交還給事件循環。
  • 等待任務: 事件循環會去執行其他已準備好的任務。
  • 恢復執行: 直到 await 后面的異步操作(比如 asyncio.sleep() 或一個網絡請求)完成并返回結果后,當前協程才會恢復執行,并從暫停的地方繼續。

三、用 asyncio 實現并發

現在,我們把這些概念組合起來,看看如何用 asyncio 同時執行多個任務。

1. 簡單示例:等待 3 秒和 1 秒

我們希望程序能夠并發地等待 3 秒和 1 秒,總耗時應該接近于兩者中較長的那個(即 3 秒),而不是 4 秒。

import asyncio
import time

# 協程函數,注意前面的 async
asyncdef task_a():
    print(f"Task A: 啟動于 {time.strftime('%X')}")
    # 遇到 await 暫停,將控制權交給事件循環
    await asyncio.sleep(3) 
    print(f"Task A: 結束于 {time.strftime('%X')}")

asyncdef task_b():
    print(f"Task B: 啟動于 {time.strftime('%X')}")
    # 遇到 await 暫停,將控制權交給事件循環
    await asyncio.sleep(1) 
    print(f"Task B: 結束于 {time.strftime('%X')}")

# 主協程函數
asyncdef main():
    print(f"主程序開始于 {time.strftime('%X')}")
    
    # **關鍵步驟**:使用 asyncio.gather() 并發運行多個協程
    await asyncio.gather(task_a(), task_b())
    
    print(f"主程序結束于 {time.strftime('%X')}")

# 運行事件循環
if __name__ == "__main__":
    # asyncio.run() 是 Python 3.7+ 推薦的啟動方式
    # 它負責創建并關閉事件循環,并執行傳入的頂級協程。
    asyncio.run(main())

運行結果(注意時間):

主程序開始于 18:33:45
Task A: 啟動于 18:33:45
Task B: 啟動于 18:33:45
Task B: 結束于 18:33:46  <-- 注意,B 在 1 秒后先完成了
Task A: 結束于 18:33:48
主程序結束于 18:33:48

可以看到,盡管 task_a 需要 3 秒,task_b 需要 1 秒,但它們是同時開始執行的,整個程序只用了大約 3 秒就完成了,完美實現了異步并發!

2. 獲取返回值

在實際應用中,我們還需要獲取異步操作的結果。asyncio.gather() 不僅能并發運行,還能返回每個協程的結果。

import asyncio

asyncdef fetch_user(user_id):
    """模擬根據 ID 獲取用戶信息"""
    print(f"正在異步獲取用戶 ID: {user_id}")
    await asyncio.sleep(2) # 模擬網絡延遲 2 秒
    return {"id": user_id, "name": f"User_{user_id}", "status": "Ready"}

asyncdef main_with_result():
    # 同時發起 3 個用戶的獲取請求
    tasks = [
        fetch_user(101),
        fetch_user(102),
        fetch_user(103)
    ]
    
    # asyncio.gather() 等待所有協程完成,并返回一個包含所有結果的列表
    results = await asyncio.gather(*tasks)
    
    print("\n所有用戶數據已獲取:")
    for res in results:
        print(f"- {res}")

if __name__ == "__main__":
    asyncio.run(main_with_result())

代碼解析:

(1) fetch_user(user_id) 是一個協程函數,它會返回一個字典。

(2) 在 main_with_result 中,我們創建了 3 個 fetch_user 的協程對象,并將它們放入 tasks 列表中。

(3) await asyncio.gather(*tasks):

  • *tasks 將列表解包成獨立的參數。
  • asyncio.gather 并發地運行所有協程。
  • await 暫停 main_with_result,直到所有 3 個獲取用戶的協程都完成。
  • 最終,results 會按傳入任務的順序包含 3 個字典結果。

四、總結與進階

通過上面的例子,相信你已經掌握了 Python 異步編程的靈魂三件套:

元素

作用

放在哪里

相當于現實中的...

async

定義一個可暫停的協程函數。

def

 前

告訴我,這是一個可以中途休息的任務

await

暫停

當前協程,并等待一個異步操作完成。

只能在 async 函數內

叫號器響了,去等結果吧,我先去做別的!

asyncio

提供了事件循環等機制,管理協程的調度和運行。

模塊/運行時環境

咖啡店里的總調度師

異步編程的威力遠不止于此,它在網絡爬蟲(如 aiohttp)、Web 框架(如 FastAPI、Starlette)、高并發 API 服務器等領域都有廣泛應用。

如果你想讓你的 Python 程序“快到飛起”,那么掌握 asyncio 絕對是必修課!一起擼起來吧~

責任編輯:趙寧寧 來源: 左詩右碼
相關推薦

2019-10-15 15:19:59

Python爬蟲low

2022-10-09 10:11:30

Python爬蟲神器

2018-01-29 09:28:44

2022-05-15 15:14:04

爬蟲Requests反爬

2020-04-27 09:25:16

Python爬蟲庫數據科學

2022-09-06 11:56:08

Python爬蟲技巧

2017-08-09 15:27:33

python爬蟲開發工具

2017-06-30 13:23:02

2019-02-20 09:35:05

爬蟲工程師開發工具

2019-10-09 08:24:33

爬蟲框架Python

2016-11-01 20:37:31

javascriptnode.jstypescript

2020-10-19 19:25:32

Python爬蟲代碼

2023-11-22 07:42:01

2019-05-21 14:08:40

豆瓣Python圖書

2024-12-20 12:30:00

Python'|'代碼

2024-06-07 08:56:43

HTTPPythonSelenium

2023-08-30 08:43:42

asyncioaiohttp

2022-11-24 10:24:32

2024-11-27 06:31:02

2017-08-22 17:30:14

Python爬蟲
點贊
收藏

51CTO技術棧公眾號

日韩三级视频在线看| 成人精品久久一区二区三区| 日本va中文字幕| 亚洲日本欧美| 国内偷自视频区视频综合| caopeng在线| 中文字幕欧美激情| 一区二区三区我不卡| 国产二区精品| 九九视频这里只有精品| 中文字幕在线观看播放| 亚洲欧美另类久久久精品| avav在线播放| 免费永久网站黄欧美| 欧美性受xxxx黑人猛交| 伊人久久在线| 欧美婷婷六月丁香综合色| 成人午夜剧场免费观看完整版| 日本视频在线一区| www.一区二区三区| 亚洲人成网www| 欧美裸体xxxx极品少妇| caoporn-草棚在线视频最| 在线观看视频一区二区欧美日韩| 男女视频在线看| www.色精品| 亚洲欧美日韩精品在线| 国产精品一二| 国产一区二区精品免费| 欧美肥老太太性生活| 久久激五月天综合精品| www.日本不卡| 国产一二三四五| 日韩av中文字幕一区二区| 国产精品久久久对白| 亚洲理论电影网| 国产成人自拍视频在线观看| 99这里只有精品视频| 久久精品美女视频网站| 开心久久婷婷综合中文字幕| 亚洲男人7777| 欧美人与性动交xxⅹxx| 亚洲男女自偷自拍图片另类| 黄频免费在线观看| 亚洲精品成人网| 91丝袜在线| 亚洲美女黄色片| 欧美黑人疯狂性受xxxxx野外| 亚洲精品一区二区三区四区高清| 超碰人人在线| 欧美精品一区视频| 国产蜜臀一区二区打屁股调教| 欧美一区二区三区在线看| 麻豆视频网站在线观看| 欧美美女激情18p| 欧洲成人综合网| 精品一区二区三区四区在线| 九色porny自拍视频在线播放| 日韩国产精品视频| av成人免费| 久久频这里精品99香蕉| 任你弄精品视频免费观看| 欧美中文字幕在线播放| 888久久久| 久久国产精品久久| 美女mm1313爽爽久久久蜜臀| 白白操在线视频| 久久综合久久99| eeuss在线观看| 91精品国产欧美日韩| 亚洲黄色中文字幕| 欧美激情精品久久久久久免费印度 | 91av在线看| 不卡视频在线| 久久综合精品一区| eeuss影院一区二区三区| 男男做性免费视频网| 欧美日韩国产精品一区二区三区四区 | 国产二区视频在线观看| 精品久久一区二区| 国产一区二区三区免费观看在线| 午夜精品视频网站| 亚洲视频观看| 精品国产一二三四区| 亚洲精品免费在线观看| 尤物网址在线观看| 日韩中文字幕免费| 国产精品久久久久久| 国产又粗又硬又长| 亚洲激情图片小说视频| 日本aa在线| 欧美性视频网站| 视频一区二区欧美| 成人狠狠色综合| 日韩一区二区高清| 亚洲美女15p| 亚洲最大免费| 亚洲3atv精品一区二区三区| 美女视频在线免费| 国产色综合天天综合网| 国产99一区视频免费 | 中文字幕在线观看亚洲| 国产免费av一区二区三区| 亚洲国产精品视频一区| 亚洲天堂2016| 高h视频在线播放| 日韩美女av在线免费观看| 蜜臀av一级做a爰片久久| 日本电影免费看| 亚洲天堂男人天堂女人天堂| 天天插综合网| 男人天堂成人在线| 亚洲成人久久电影| 亚洲成人免费| 色悠悠久久综合网| 亚洲电影在线看| 亚洲精品国产首次亮相| 国产成人av影视| 亚洲国产高清福利视频| 91精品久久久久久久蜜月| www.亚洲天堂网| 亚洲国产91精品在线观看| 欧美日韩国产免费观看视频| 乱子伦一区二区| 欧美精品一二三| 正在播放欧美一区| 国产精品久久久久天堂| 狠狠入ady亚洲精品| 免费h在线看| 大荫蒂性生交片| 亚洲素人一区二区| 欧美裸体xxxx极品少妇| 欧美韩国日本一区| 在线天堂一区av电影| 林ゆな中文字幕一区二区| 日韩免费电影一区二区三区| 午夜av一区二区三区| 一本色道69色精品综合久久| 污视频在线免费观看一区二区三区| 午夜成人免费视频| 国产99久久| 邪恶网站在线观看| 精品精品国产国产自在线| 久久爱www久久做| 男人的天堂在线视频免费观看| 国产日韩欧美视频在线| 亚洲一卡二卡三卡四卡| 九九视频精品全部免费播放| 天天综合网日韩| 蜜臀久久99精品久久久无需会员 | 国产精品综合网| 欧美videossex| 日本一区二区不卡高清更新| 色婷婷综合久久久中文一区二区| 亚洲专区**| 免费男同深夜夜行网站| 久久人体大胆视频| 91免费小视频| 亚洲电影二区| 2022亚洲天堂| 欧美激情性做爰免费视频| 91免费观看在线| 伊人久久大香伊蕉在人线观看热v| 国产美女永久无遮挡| 亚洲一二三在线| 97超碰欧美中文字幕| 奇米一区二区| av成人网在线| 国产精品亚洲第一区| 亚洲曰韩产成在线| 综合天天久久| 久草中文在线| 久久久久久久久久久久久国产| 在线观看国产欧美| 久久精品人人做| 偷拍精品福利视频导航| 日本视频二区| 国内一区二区三区在线视频| 欧美一区二区三区在线电影| 日本亚洲最大的色成网站www| 男男gaygays亚洲| 欧美黄色免费网址| 国内揄拍国内精品| 日韩欧美第一页| 青青草国产精品97视觉盛宴| 成人日韩在线| av手机在线看| 国产九色精品| 亚洲欧美日韩一区二区三区在线| 99r国产精品| 日韩中文首页| heyzo中文字幕在线| 日韩中文字幕组| 亚洲999一在线观看www| 3atv在线一区二区三区| 成人av午夜影院| 日韩av在线播放网址| 暖暖在线中文免费日本| 国产精品igao| 国产一区免费观看|