Synchronisierte Programmierung
Bei der synchronen Programmierung werden Aufgaben nacheinander ausgeführt. Jede Aufgabe muss abgeschlossen sein, bevor die nächste beginnt. Dieser lineare Ansatz ist unkompliziert, kann jedoch ineffizient sein, insbesondere wenn es um E/A-gebundene Vorgänge wie das Lesen von Dateien, Netzwerkanforderungen oder Datenbankabfragen geht.
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()
In diesem Beispiel muss Aufgabe1 abgeschlossen sein, bevor Aufgabe2 beginnt. Die Gesamtausführungszeit ist die Summe der Zeit, die jede Aufgabe benötigt.
Asynchrone Programmierung
Durch die asynchrone Programmierung können mehrere Aufgaben gleichzeitig ausgeführt werden, wodurch die Effizienz verbessert wird, insbesondere bei E/A-gebundenen Aufgaben. Die Asyncio-Bibliothek von Python stellt die notwendigen Werkzeuge für die asynchrone Programmierung bereit.
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())
In diesem Beispiel werden Aufgabe 1 und Aufgabe 2 gleichzeitig ausgeführt, wodurch die Gesamtausführungszeit auf die Zeit reduziert wird, die die längste Aufgabe benötigt.
Mögliche Anwendungen
Wahl zwischen synchron und asynchron
Anwendungsbeispiel für Echtzeit-Messaging
Erstellen wir eine einfache Echtzeit-Messaging-Anwendung mit FastAPI für das Backend und WebSockets für die Echtzeitkommunikation. Wir verwenden Streamlit für das Frontend, um Nachrichten anzuzeigen.
Backend (FastAPI + WebSockets)
1.Abhängigkeiten installieren:
pip install fastapi uvicorn websockets
2.Backend-Code (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(""" <!DOCTYPE html> <html> <head> <title>Chat</title> </head> <body> <h1>WebSocket Chat</h1> <form action="" onsubmit="sendMessage(event)"> <input type="text" id="messageText" autocomplete="off"/> <button>Send</button> </form> <ul id='messages'> </ul> <script> var ws = new WebSocket("ws://localhost:8000/ws"); ws.onmessage = function(event) { var messages = document.getElementById('messages'); var message = document.createElement('li'); message.appendChild(document.createTextNode(event.data)); messages.appendChild(message); }; function sendMessage(event) { var input = document.getElementById("messageText"); ws.send(input.value); input.value = ''; event.preventDefault(); } </script> </body> </html> """) if __name__ == "__main__": import uvicorn uvicorn.run(app, host="0.0.0.0", port=8000)
Frontend (Streamlit)
pip install streamlit websocket-client
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)
Ausführen der Anwendung
uvicorn backend:app
streamlit run frontend.py
Erklärung
Backend (backend.py):
Frontend (frontend.py):
Dieses Beispiel zeigt eine einfache Echtzeit-Messaging-Anwendung, die FastAPI und WebSockets für das Backend und Streamlit für das Frontend verwendet.
Das obige ist der detaillierte Inhalt vonSynchrone und asynchrone Programmierung in Python: Schlüsselkonzepte und Anwendungen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!