同步程式設計
在同步編程中,任務是一個接一個地執行的。每項任務必須在下一項任務開始之前完成。這種線性方法很簡單,但效率可能較低,尤其是在處理文件讀取、網路請求或資料庫查詢等 I/O 密集型操作時。
import time def task1(): print("Starting task 1...") time.sleep(2) print("Task 1 completed") def task2(): print("Starting task 2...") time.sleep(2) print("Task 2 completed") def main(): task1() task2() if __name__ == "__main__": main()
在此範例中,任務 1 必須在任務 2 開始之前完成。總執行時間是每個任務所花費時間的總和。
非同步程式設計
非同步編程允許多個任務同時運行,從而提高效率,特別是對於 I/O 密集型任務。 Python 的 asyncio 函式庫提供了非同步程式設計所需的工具。
import asyncio async def task1(): print("Starting task 1...") await asyncio.sleep(2) print("Task 1 completed") async def task2(): print("Starting task 2...") await asyncio.sleep(2) print("Task 2 completed") async def main(): await asyncio.gather(task1(), task2()) if __name__ == "__main__": asyncio.run(main())
在這個例子中,task1和task2並發運行,將總執行時間減少到最長任務所花費的時間。
潛在應用
Web 伺服器和 API:
- 同步:像 Flask 這樣的傳統 Web 框架會依序處理請求。在處理大量請求時,這可能會成為瓶頸。
- 非同步:FastAPI 和 aiohttp 等框架使用非同步程式設計來同時處理多個請求,從而提高吞吐量和效能。
即時訊息應用程式:
- 同步:如果按順序處理每個訊息,處理即時訊息可能會導致延遲。
- 非同步:使用具有非同步處理功能的 WebSocket(例如 websockets 庫)可以實現即時雙向通信,從而實現高效能聊天應用程式、即時通知等。
資料處理管道:
- 同步:依序處理大型資料集可能非常耗時。
- 非同步:非同步任務可以同時取得、處理和儲存數據,顯著減少處理時間。像 aiohttp 和 aiomysql 這樣的函式庫可用於非同步 HTTP 請求和資料庫操作。
網頁抓取:
- 同步:順序取得網頁可能會很慢且效率低。
- 非同步:使用aiohttp進行非同步HTTP請求可以同時取得多個網頁,並加快網頁抓取流程。
文件I/O操作:
- 同步:順序讀取/寫入大檔案可能會阻塞其他操作。
- 非同步:使用 aiofile 的非同步檔案 I/O 操作可以透過允許其他任務同時運行來提高效能。
同步與非同步之間的選擇
- 對 CPU 密集型任務使用同步編程,這些任務是計算密集型的,並且可以從順序運行中受益。
- 對 I/O 密集型任務使用非同步編程,其中操作涉及等待外部資源,例如網路請求、檔案 I/O 或資料庫查詢。
即時訊息應用範例
讓我們創建一個基本的即時訊息應用程序,使用 FastAPI 作為後端,使用 WebSockets 進行即時通訊。我們將使用 Streamlit 作為前端來顯示訊息。
後端(FastAPI + WebSockets)
1.安裝相依性:
pip install fastapi uvicorn websockets
2.後端程式碼(backend.py):
from fastapi import FastAPI, WebSocket, WebSocketDisconnect from fastapi.responses import HTMLResponse from typing import List app = FastAPI() class ConnectionManager: def __init__(self): self.active_connections: List[WebSocket] = [] async def connect(self, websocket: WebSocket): await websocket.accept() self.active_connections.append(websocket) def disconnect(self, websocket: WebSocket): self.active_connections.remove(websocket) async def send_message(self, message: str): for connection in self.active_connections: await connection.send_text(message) manager = ConnectionManager() @app.websocket("/ws") async def websocket_endpoint(websocket: WebSocket): await manager.connect(websocket) try: while True: data = await websocket.receive_text() await manager.send_message(data) except WebSocketDisconnect: manager.disconnect(websocket) @app.get("/") async def get(): return HTMLResponse(""" <title>Chat</title> <h1 id="WebSocket-Chat">WebSocket Chat</h1>
前端(Streamlit)
- 安裝依賴項:
pip install streamlit websocket-client
- 前端程式碼(frontend.py):
import streamlit as st import asyncio import threading from websocket import create_connection, WebSocket st.title("Real-time Messaging Application") if 'messages' not in st.session_state: st.session_state.messages = [] def websocket_thread(): ws = create_connection("ws://localhost:8000/ws") st.session_state.ws = ws while True: message = ws.recv() st.session_state.messages.append(message) st.experimental_rerun() if 'ws' not in st.session_state: threading.Thread(target=websocket_thread, daemon=True).start() input_message = st.text_input("Enter your message:") if st.button("Send"): if input_message: st.session_state.ws.send(input_message) st.session_state.messages.append(f"You: {input_message}") st.subheader("Chat Messages:") for message in st.session_state.messages: st.write(message)
運行應用程式
- 啟動FastAPI後端:
uvicorn backend:app
- 啟動 Streamlit 前端:
streamlit run frontend.py
說明
後端(backend.py):
- FastAPI 應用程式在 /ws 處有一個 WebSocket 端點。
- ConnectionManager 處理 WebSocket 連接,向所有連接的客戶端廣播訊息。
- 根端點 (/) 提供一個簡單的 HTML 頁面來測試 WebSocket 連線。
前端(frontend.py):
- Streamlit 應用程式連接到 WebSocket 伺服器並偵聽傳入訊息。
- 一個單獨的線程處理 WebSocket 連接,以防止阻塞 Streamlit 應用程式。
- 使用者可以透過輸入框傳送訊息,訊息會被傳送到WebSocket伺服器並顯示在聊天中。
此範例示範了一個簡單的即時訊息應用程序,在後端使用 FastAPI 和 WebSockets,在前端使用 Streamlit。
以上是Python 中的同步和非同步程式設計:關鍵概念和應用的詳細內容。更多資訊請關注PHP中文網其他相關文章!

Linux終端中查看Python版本時遇到權限問題的解決方法當你在Linux終端中嘗試查看Python的版本時,輸入python...

本文解釋瞭如何使用美麗的湯庫來解析html。 它詳細介紹了常見方法,例如find(),find_all(),select()和get_text(),以用於數據提取,處理不同的HTML結構和錯誤以及替代方案(SEL)

本文比較了Tensorflow和Pytorch的深度學習。 它詳細介紹了所涉及的步驟:數據準備,模型構建,培訓,評估和部署。 框架之間的關鍵差異,特別是關於計算刻度的

在使用Python的pandas庫時,如何在兩個結構不同的DataFrame之間進行整列複製是一個常見的問題。假設我們有兩個Dat...

本文指導Python開發人員構建命令行界面(CLIS)。 它使用Typer,Click和ArgParse等庫詳細介紹,強調輸入/輸出處理,並促進用戶友好的設計模式,以提高CLI可用性。

本文討論了諸如Numpy,Pandas,Matplotlib,Scikit-Learn,Tensorflow,Tensorflow,Django,Blask和請求等流行的Python庫,並詳細介紹了它們在科學計算,數據分析,可視化,機器學習,網絡開發和H中的用途

文章討論了虛擬環境在Python中的作用,重點是管理項目依賴性並避免衝突。它詳細介紹了他們在改善項目管理和減少依賴問題方面的創建,激活和利益。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

SAP NetWeaver Server Adapter for Eclipse
將Eclipse與SAP NetWeaver應用伺服器整合。

ZendStudio 13.5.1 Mac
強大的PHP整合開發環境

MantisBT
Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。

Safe Exam Browser
Safe Exam Browser是一個安全的瀏覽器環境,安全地進行線上考試。該軟體將任何電腦變成一個安全的工作站。它控制對任何實用工具的訪問,並防止學生使用未經授權的資源。

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)