👩‍💻 Develope/Python

[Python] 동시성 프로그래밍 (1) 프로세스, 스레드

heywantodo 2024. 11. 5. 17:33
728x90
반응형

[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")

 

728x90
반응형