Maison >développement back-end >Tutoriel Python >Programmation synchrone et asynchrone en Python : concepts clés et applications
Programmation Synchrone
En programmation synchrone, les tâches sont exécutées les unes après les autres. Chaque tâche doit être terminée avant que la suivante ne commence. Cette approche linéaire est simple mais peut s'avérer inefficace, en particulier lorsqu'il s'agit d'opérations liées aux E/S telles que la lecture de fichiers, les requêtes réseau ou les requêtes de base de données.
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()
Dans cet exemple, la tâche 1 doit être terminée avant le démarrage de la tâche 2. Le temps total d'exécution est la somme du temps pris par chaque tâche.
Programmation asynchrone
La programmation asynchrone permet à plusieurs tâches de s'exécuter simultanément, améliorant ainsi l'efficacité, en particulier pour les tâches liées aux E/S. La bibliothèque asyncio de Python fournit les outils nécessaires à la programmation asynchrone.
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())
Dans cet exemple, la tâche 1 et la tâche 2 s'exécutent simultanément, réduisant le temps d'exécution total au temps pris par la tâche la plus longue.
Applications potentielles
Choisir entre synchrone et asynchrone
Exemple d'application de messagerie en temps réel
Créons une application de messagerie de base en temps réel en utilisant FastAPI pour le backend et WebSockets pour la communication en temps réel. Nous utiliserons Streamlit pour le frontend afin d'afficher les messages.
Backend (FastAPI + WebSockets)
1.Installer les dépendances :
pip installe les websockets fastapi uvicorn
2.Code backend (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)
Exécuter l'application
uvicorn backend:app
streamlit run frontend.py
Explication
Back-end (backend.py) :
Frontend (frontend.py) :
Cet exemple montre une application simple de messagerie en temps réel utilisant FastAPI et WebSockets pour le backend et Streamlit pour le frontend.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!