Python에서 동시성은 하나의 프로그램이 여러 작업을 동시에 또는 거의 동시에 처리하는 능력입니다.
# Thread 방식 - 여러 작업이 동시에 실행됨
import threading
def work(name):
print(f"{name} 작업 시작")
# 작업 수행
print(f"{name} 작업 완료")
# 두 개의 작업을 동시에 실행
t1 = threading.Thread(target=work, args=("작업1",))
t2 = threading.Thread(target=work, args=("작업2",))
t1.start()
t2.start()
요약: Python 동시성은 프로그램이 여러 작업을 효과적으로 관리하고 처리하는 기술입니다. 작업의 성격에 따라 적절한 방식을 선택해야 합니다.
# 필요한 모듈을 불러옵니다
import threading # 스레드를 사용하기 위한 모듈
import time # 시간을 다루기 위한 모듈
import sys # 시스템 관련 작업을 위한 모듈
# 스피너를 실행하는 함수 (스레드에서 실행됨)
def spinner_thread(name, delay):
'''스레드에서 실행되는 스피너 함수'''
# 다양한 스피너 모양을 정의합니다
spinner_chars = ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏']
idx = 0 # 스피너 모양의 인덱스를 초기화
# 무한 루프로 스피너를 계속 실행
while True:
# 현재 스피너 모양을 출력 (줄 바꿈 없이)
sys.stdout.write(f'\r{name}: {spinner_chars[idx]}')
# 출력 내용을 즉시 보여줍니다
sys.stdout.flush()
# delay 시간만큼 기다립니다
time.sleep(delay)
# 다음 스피너 모양으로 이동 (리스트의 끝에 도달하면 처음으로 돌아감)
idx = (idx + 1) % len(spinner_chars)
# 메인 함수 - 프로그램의 시작점
def main():
# 첫 번째 스피너 스레드를 생성 (Thread-1, 0.2초 간격)
t1 = threading.Thread(target=spinner_thread, args=('Thread-1', 0.2))
# 두 번째 스피너 스레드를 생성 (Thread-2, 0.15초 간격)
t2 = threading.Thread(target=spinner_thread, args=('Thread-2', 0.15))
# 스레드를 데몬으로 설정 (메인 프로그램이 종료되면 자동으로 종료됨)
t1.daemon = True
t2.daemon = True
# 두 스레드를 실행 시작
t1.start()
t2.start()
# 5초 동안 작업을 시뮬레이션
time.sleep(5)
# 작업 완료 메시지를 출력
print('\nThread 기반 스피너 예제 완료!')
# 프로그램이 직접 실행될 때만 아래 코드를 실행
if __name__ == '__main__':
main()
주요 특성:
# 필요한 모듈을 불러옵니다
import multiprocessing # 프로세스를 사용하기 위한 모듈
import time # 시간을 다루기 위한 모듈
import sys # 시스템 관련 작업을 위한 모듈
# 스피너를 실행하는 함수 (프로세스에서 실행됨)
def spinner_process(name, delay):
'''프로세스에서 실행되는 스피너 함수'''
# 다양한 스피너 모양을 정의합니다
spinner_chars = ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏']
idx = 0 # 스피너 모양의 인덱스를 초기화
# 무한 루프로 스피너를 계속 실행
while True:
# 현재 스피너 모양을 출력 (줄 바꿈 없이)
sys.stdout.write(f'\r{name}: {spinner_chars[idx]}')
# 출력 내용을 즉시 보여줍니다
sys.stdout.flush()
# delay 시간만큼 기다립니다
time.sleep(delay)
# 다음 스피너 모양으로 이동 (리스트의 끝에 도달하면 처음으로 돌아감)
idx = (idx + 1) % len(spinner_chars)
# 메인 함수 - 프로그램의 시작점
def main():
# 첫 번째 스피너 프로세스를 생성 (Process-1, 0.2초 간격)
p1 = multiprocessing.Process(target=spinner_process, args=('Process-1', 0.2))
# 두 번째 스피너 프로세스를 생성 (Process-2, 0.15초 간격)
p2 = multiprocessing.Process(target=spinner_process, args=('Process-2', 0.15))
# 두 프로세스를 실행 시작
p1.start()
p2.start()
# 5초 동안 작업을 시뮬레이션
time.sleep(5)
# 프로세스 종료 (실제 애플리케이션에서는 더 잘 처리해야 함)
p1.terminate()
p2.terminate()
# 작업 완료 메시지를 출력
print('\nProcess 기반 스피너 예제 완료!')
# 프로그램이 직접 실행될 때만 아래 코드를 실행
if __name__ == '__main__':
main()
주요 특성:
# 필요한 모듈을 불러옵니다
import asyncio # 비동기 프로그래밍을 위한 모듈
import sys # 시스템 관련 작업을 위한 모듈
# 스피너를 실행하는 함수 (코루틴에서 실행됨)
async def spinner_coroutine(name, delay):
'''코루틴으로 실행되는 스피너 함수'''
# 다양한 스피너 모양을 정의합니다
spinner_chars = ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏']
idx = 0 # 스피너 모양의 인덱스를 초기화
# 무한 루프로 스피너를 계속 실행
while True:
# 현재 스피너 모양을 출력 (줄 바꿈 없이)
sys.stdout.write(f'\r{name}: {spinner_chars[idx]}')
# 출력 내용을 즉시 보여줍니다
sys.stdout.flush()
# delay 시간만큼 기다립니다 (비동기적으로 기다림)
await asyncio.sleep(delay)
# 다음 스피너 모양으로 이동 (리스트의 끝에 도달하면 처음으로 돌아감)
idx = (idx + 1) % len(spinner_chars)
# 메인 함수 - 프로그램의 시작점
async def main():
# 첫 번째 스피너 코루틴을 생성 (Coroutine-1, 0.2초 간격)
task1 = asyncio.create_task(spinner_coroutine('Coroutine-1', 0.2))
# 두 번째 스피너 코루틴을 생성 (Coroutine-2, 0.15초 간격)
task2 = asyncio.create_task(spinner_coroutine('Coroutine-2', 0.15))
# 5초 동안 작업을 시뮬레이션
await asyncio.sleep(5)
# 태스크 취소 (실제 애플리케이션에서는 더 잘 처리해야 함)
task1.cancel()
task2.cancel()
# 작업 완료 메시지를 출력
print('\nCoroutine 기반 스피너 예제 완료!')
# 프로그램이 직접 실행될 때만 아래 코드를 실행
if __name__ == '__main__':
# asyncio 이벤트 루프를 실행하여 비동기 작업을 처리
asyncio.run(main())
주요 특성:
각 접근 방식의 장점: