동기 프로그래밍
동기 프로그래밍에서는 작업이 차례로 실행됩니다. 각 작업은 다음 작업이 시작되기 전에 완료되어야 합니다. 이 선형 접근 방식은 간단하지만 특히 파일 읽기, 네트워크 요청 또는 데이터베이스 쿼리와 같은 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()
이 예에서는 task2가 시작되기 전에 task1이 완료되어야 합니다. 총 실행 시간은 각 작업에 소요된 시간의 합입니다.
비동기 프로그래밍
비동기 프로그래밍을 사용하면 여러 작업을 동시에 실행할 수 있어 특히 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 설치 fastapi uvicorn 웹소켓
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)
프런트엔드(스트림라이트)
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 중국어 웹사이트의 기타 관련 기사를 참조하세요!