본문 바로가기
네트워크 프로그래밍

[네트워크 프로그래밍] Week 5: 비동기 I/O 및 멀티스레드 프로그래밍

by cogito21_python 2024. 6. 4.
반응형

비동기 I/O 및 멀티스레드 프로그래밍

Day 1: 비동기 I/O의 개념

 

강의 내용:

  1. 비동기 I/O의 정의
    • 비동기 I/O란 무엇인가?
    • 비동기 I/O와 동기 I/O의 차이점
  2. 비동기 I/O의 필요성
    • 고성능 네트워크 애플리케이션의 요구사항
    • 리소스 효율적인 사용
    • 응답 시간 단축
  3. Python의 asyncio 모듈 소개
    • asyncio 모듈 개요
    • 주요 구성 요소: 이벤트 루프, 코루틴, 태스크

실습:

  • 간단한 비동기 I/O 예제
import asyncio

async def hello_world():
    print("Hello, World!")
    await asyncio.sleep(1)
    print("Goodbye, World!")

asyncio.run(hello_world())

 

Day 2: asyncio를 사용한 비동기 네트워크 프로그래밍

강의 내용:

  1. 이벤트 루프와 코루틴
    • 이벤트 루프의 역할
    • 코루틴의 정의와 사용법
  2. 비동기 네트워크 프로그래밍 기초
    • 비동기 소켓 사용법
    • asyncio를 사용한 TCP 서버와 클라이언트
  3. 비동기 네트워크 프로그래밍 심화
    • 비동기 데이터 전송과 수신
    • 비동기 예외 처리

실습:

  • asyncio를 사용한 TCP 서버와 클라이언트 구현
# 비동기 TCP 서버
import asyncio

async def handle_client(reader, writer):
    data = await reader.read(100)
    message = data.decode()
    print(f"Received: {message}")

    writer.write(data)
    await writer.drain()
    writer.close()

async def main():
    server = await asyncio.start_server(handle_client, '127.0.0.1', 8888)
    async with server:
        await server.serve_forever()

asyncio.run(main())
# 비동기 TCP 클라이언트
import asyncio

async def tcp_client():
    reader, writer = await asyncio.open_connection('127.0.0.1', 8888)
    message = 'Hello, Server!'
    writer.write(message.encode())
    await writer.drain()

    data = await reader.read(100)
    print(f"Received: {data.decode()}")

    writer.close()
    await writer.wait_closed()

asyncio.run(tcp_client())

 

Day 3: 멀티스레드 프로그래밍의 개념

강의 내용:

  1. 멀티스레드의 정의
    • 스레드란 무엇인가?
    • 멀티스레드 프로그래밍의 개념
    • 멀티스레드의 장점과 단점
  2. Python의 threading 모듈 소개
    • threading 모듈 개요
    • 주요 구성 요소: 스레드, 락, 큐
  3. 멀티스레드의 활용 사례
    • 병렬 작업 처리
    • I/O 바운드 작업 최적화

실습:

  • 간단한 멀티스레드 예제
import threading

def print_numbers():
    for i in range(5):
        print(f"Number: {i}")

def print_letters():
    for letter in 'abcde':
        print(f"Letter: {letter}")

if __name__ == "__main__":
    thread1 = threading.Thread(target=print_numbers)
    thread2 = threading.Thread(target=print_letters)

    thread1.start()
    thread2.start()

    thread1.join()
    thread2.join()

 

Day 4: 멀티스레드를 사용한 네트워크 프로그래밍

강의 내용:

  1. 멀티스레드를 사용한 동시성 처리
    • 동시성 처리의 개념
    • 멀티스레드를 사용한 네트워크 서버 구현
  2. Python에서 멀티스레드 소켓 프로그래밍
    • 스레드 기반 TCP 서버와 클라이언트
    • 스레드 간 통신과 동기화
  3. 멀티스레드 네트워크 프로그래밍 심화
    • 스레드 풀을 이용한 서버 최적화
    • 스레드 안전한 데이터 구조 사용

실습:

  • 멀티스레드 TCP 서버와 클라이언트 구현
import socket
import threading

def handle_client(client_socket):
    while True:
        data = client_socket.recv(1024)
        if not data:
            break
        client_socket.sendall(data)
    client_socket.close()

def start_tcp_server():
    server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    server_socket.bind(('localhost', 12345))
    server_socket.listen(5)
    print("TCP 서버가 포트 12345에서 대기 중입니다.")

    while True:
        client_socket, addr = server_socket.accept()
        print(f"{addr}와 연결되었습니다.")
        client_thread = threading.Thread(target=handle_client, args=(client_socket,))
        client_thread.start()

if __name__ == "__main__":
    start_tcp_server()
import socket

def start_tcp_client():
    client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    client_socket.connect(('localhost', 12345))
    client_socket.sendall(b"Hello, Server!")
    data = client_socket.recv(1024)
    print(f"서버로부터 받은 데이터: {data.decode()}")
    client_socket.close()

if __name__ == "__main__":
    start_tcp_client()

 

Day 5: 비동기와 멀티스레드 프로그래밍 비교

강의 내용:

  1. 비동기 프로그래밍과 멀티스레드 프로그래밍의 비교
    • 장단점 비교
    • 성능 비교
  2. 적용 사례
    • 비동기 프로그래밍이 유리한 경우
    • 멀티스레드 프로그래밍이 유리한 경우
  3. 비동기와 멀티스레드의 결합 사용
    • 비동기와 멀티스레드를 함께 사용하는 방법
    • 실습 프로젝트 계획

실습:

  • 비동기와 멀티스레드의 성능 비교 실험
import asyncio
import threading
import time

# 비동기 예제
async def async_task():
    await asyncio.sleep(1)
    return "Async Task Completed"

async def async_main():
    start = time.time()
    tasks = [async_task() for _ in range(10)]
    results = await asyncio.gather(*tasks)
    end = time.time()
    print(f"Async 실행 시간: {end - start}초")

# 멀티스레드 예제
def thread_task():
    time.sleep(1)
    return "Thread Task Completed"

def thread_main():
    start = time.time()
    threads = [threading.Thread(target=thread_task) for _ in range(10)]
    for t in threads:
        t.start()
    for t in threads:
        t.join()
    end = time.time()
    print(f"Thread 실행 시간: {end - start}초")

if __name__ == "__main__":
    asyncio.run(async_main())
    thread_main()

 

Day 6: 프로젝트 준비

강의 내용:

  1. 프로젝트 주제 선정 및 요구사항 분석
    • 비동기 및 멀티스레드 프로그래밍 프로젝트 주제 논의
    • 팀 구성 및 역할 분담
  2. 프로젝트 계획 수립
    • 프로젝트 목표 및 요구사항 정의
    • 프로젝트 타임라인 설정
    • 프로젝트 도구 및 환경 설정

실습:

  • 프로젝트 계획서 작성 및 공유
### 실습: 프로젝트 계획서 작성
1. 프로젝트 목표 정의
2. 기능 명세서 작성
3. 개발 일정 및 마일스톤 설정
4. 역할 분담 및 작업 계획 수립
5. GitHub 저장소 생성 및 초기화

 

이 강의는 비동기 I/O와 멀티스레드 프로그래밍의 개념과 활용 방법을 다루며, 두 가지 접근 방식의 장단점을 비교하고 적절한 사용 사례를 이해하는 것을 목표로 합니다. 실습을 통해 이론을 실제로 적용해보고, 프로젝트 준비를 통해 실무 경험을 쌓을 수 있습니다.

 

 

반응형