[Python] 동시성 프로그래밍 (1) 프로세스, 스레드
동시성 프로그래밍은 여러 작업을 동시에 수행할 수 있도록 하는 프로그래밍 기법이다.
이는 여러 프로세스나 스레드를 사용하여, 동시에 실행되는 프로그램을 작성하는 것을 포함한다.
동시성 프로그래밍은 특히 멀티코어 프로세서와 네트환경에서 중요하며, 이 방식은 다음과 같은 두 가지 주요 개념들을 포함한다.
병렬성 (Parallelism) | 여러 작업이 동시에 실행되는 것 |
비동기성 (Asynchrony) | 작업이 시작된 후, 그 작업이 완료될 때 까지 기다리지 않고 다른 작업을 수행 |
프로세스(Process) 스레드(Thread)
멀티코어 프로세서의 발전으로, CPU의 모든 코어를 활용하여 작업을 병렬로 처리함으로써 처리 시간을 단축할 수 있다. CPU는 프로세스를 실행하기 위해 프로세스의 명령어를 가져와 처리한다.
(1) 프로세스 (Process)
프로세스는 실행 중인 프로그램의 인스턴스다.
웹 서버 소프트웨어가 실행될 때, 웹 서버는 메인 프로세스를 생성하고, 웹서버는 클라이언트의 요청을 처리하기 위해 fork() 시스템을 호출하여 자식 프로세스를 생성한다.
각 프로세스는 독립적인 메모리 공간을 가지며, 다른 프로세스와는 메모리를 공유하지 않는다.
예를 들어, 웹 브라우저(프로세스 A)와 텍스트 편집기(프로세스 B)가 동시에 실행되고있다고 가정해보자.
이 두 애플리케이션은 각각의 프로세스로 실행이 된다.
프로세스 A와 프로세스 B는 서로 독립적으로 실행되며, 하나가 종료되더라도 다른 하나는 영향을 받지 않는다.
또한 웹 브라우저에서 열려있는 탭의 데이터는 텍스트 편집기와 공유되지 않는다.
만약 두 프로세스 간에 데이터를 공유하고 싶다면, 파일, 소켓, 큐 등을 사용해야 한다.
파이썬에서는 multiprocessing 모듈을 사용하여 프로세스를 생성 할 수 있다.
from multiprocessing import Process, Queue
import time
def worker(queue):
time.sleep(2) # 작업을 시뮬레이션
queue.put("Worker process completed")
if __name__ == "__main__":
queue = Queue()
p1 = Process(target=worker, args=(queue,))
p2 = Process(target=worker, args=(queue,))
p1.start()
p2.start()
p1.join()
p2.join()
print(queue.get())
print(queue.get())
(2) 스레드 (Thread)
스레드는 프로세스 내에서 실행되는 경량의 실행 단위다.
클라이언트가 요청을 보내면, 메인 프로세스는 요청을 처리하기 위해 스레드를 생성하고 요청이 들어올 대 마다 스레드를 생성하여 요청을 처리한다.
여러 스레드는 동일한 메모리 공간을 공유하며, 같은 프로세스 내에서 동시에 실행된다.
예를 들어, 웹 브라우저에서 여러 탭을 열어 동시에 여러 웹 페이지를 로드하는 경우를 생각해보자.
각 탭은 하나의 스레드로 실행될 수 있다.
웹1과 웹2는 같은 프로세스(웹 브라우저) 내에서 실행되며, 메모리를 공유한다.
따라서 두 스레드는 같은 데이터를 쉽게 접근할 수 있지만 이로 인해 데이터 경합 문제가 발생할 수도 있다.
파이썬에서는 threading 모듈을 사용하여 스레드를 생성할 수 있다.
import threading
import time
def worker():
time.sleep(2) # 작업을 시뮬레이션
print("Worker thread completed")
if __name__ == "__main__":
t1 = threading.Thread(target=worker)
t2 = threading.Thread(target=worker)
t1.start()
t2.start()
t1.join()
t2.join()
print("Both threads completed")
'👩💻 Develope > Python' 카테고리의 다른 글
[Python] pip freeze 명령어 사용 시 패키지 버전이 제대로 나오지 않을 때 (0) | 2024.10.14 |
---|---|
[Python][bs4] BeautifulSoup4에서 텍스트로 파싱하기 (0) | 2024.10.08 |
[Python] glob (1) | 2024.09.26 |
[Python] SQLAlchemy 이해하기 (0) | 2024.09.02 |
[Pandas] to.sql() (0) | 2024.08.23 |