同期プログラミング
同期プログラミングでは、タスクが次々に実行されます。各タスクは、次のタスクが開始される前に完了する必要があります。この線形アプローチは単純ですが、特にファイル読み取り、ネットワーク リクエスト、データベース クエリなどの 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()
この例では、タスク 2 が開始される前にタスク 1 が完了する必要があります。合計実行時間は、各タスクにかかった時間の合計です。
非同期プログラミング
非同期プログラミングでは、複数のタスクを同時に実行できるため、特に 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 を、リアルタイム通信には WebSocket を使用して、基本的なリアルタイム メッセージング アプリケーションを作成してみましょう。フロントエンドに Streamlit を使用してメッセージを表示します。
バックエンド (FastAPI + WebSocket)
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 と WebSocket、フロントエンドに Streamlit を使用したシンプルなリアルタイム メッセージング アプリケーションを示します。
以上がPython での同期および非同期プログラミング: 主要な概念と応用の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。