同步编程
在同步编程中,任务是一个接一个地执行的。每项任务必须在下一项任务开始之前完成。这种线性方法很简单,但效率可能较低,尤其是在处理文件读取、网络请求或数据库查询等 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并发运行,将总执行时间减少到最长任务所花费的时间。
潜在应用
同步和异步之间的选择
实时消息应用示例
让我们创建一个基本的实时消息应用程序,使用 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(""" <!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)
前端(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)
运行应用程序
uvicorn backend:app
streamlit run frontend.py
说明
后端(backend.py):
前端(frontend.py):
此示例演示了一个简单的实时消息应用程序,在后端使用 FastAPI 和 WebSockets,在前端使用 Streamlit。
以上是Python 中的同步和异步编程:关键概念和应用的详细内容。更多信息请关注PHP中文网其他相关文章!