목차
- Global Interpreter Lock(GIL) 이해
- 멀티스레딩 vs. 멀티프로세싱 장단점 설명
- 스레드 간 Lock 동기화 예제
- 데드락과 교착 상태 설명
- 스레드 안전성과 주의사항
1. Global Interpreter Lock(GIL) 이해
파이썬 인터프리터는 GIL이라는 Global Interpreter Lock을 가지고 있습니다.
이로 인해 파이썬에서는 여러 스레드가 동시에 실행되는 것처럼 보이지만 실제로는 하나의 스레드만 한 번에 실행됩니다.
따라서 파이썬 스레드는 CPU-bound 작업보다는 I/O-bound 작업에 더 적합합니다.
2. 멀티스레딩 vs. 멀티프로세싱 장단점 설명
파이썬에서 스레드를 활용할 때 멀티스레딩과 멀티프로세싱을 고려해야 합니다.
멀티스레딩은 하나의 프로세스 내에서 여러 스레드를 생성하는 방식으로, 메모리 공간을 공유하기 때문에 자원 접근이 간편하지만 GIL 때문에 CPU-bound 작업에는 성능이 제한될 수 있습니다.
반면, 멀티프로세싱은 여러 프로세스를 생성하여 각각 독립적으로 실행하는 방식으로, 병렬 처리가 가능하지만 메모리 공간을 공유하지 않기 때문에 자원 공유가 복잡합니다.
3. 스레드 간 Lock 동기화 예제
여러 스레드가 공유된 자원을 동시에 접근하면 문제가 발생할 수 있습니다.
이를 해결하기 위해 스레드 간의 동기화가 필요합니다.
예를 들어, 스레드 간에 공유된 리스트를 사용할 때 각 스레드가 리스트에 동시에 접근하지 않도록 락(lock)을 사용하여 스레드 간의 실행을 동기화할 수 있습니다.
import threading
shared_list = []
lock = threading.Lock()
def append_item(item):
with lock:
shared_list.append(item)
# 여러 스레드가 공유 리스트에 접근
threads = [threading.Thread(target=append_item, args=(i,)) for i in range(100)]
for thread in threads:
thread.start()
for thread in threads:
thread.join()
print(shared_list)
4. 데드락과 교착 상태 설명
데드락은 여러 프로세스나 스레드가 서로가 가진 자원을 점유하고 있어 상대방이 점유한 자원을 기다리는 상태로, 무한 대기 상태에 빠지는 것을 의미합니다.
교착 상태는 데드락과 비슷하지만 스레드 간의 상태가 아닌, 프로세스나 스레드가 서로가 가진 자원을 얻기 위해 경쟁하는 상태를 의미합니다.
이를 방지하기 위해 락(lock)을 사용할 때 교착 상태를 조심해야 합니다.
5. 스레드 안전성과 주의사항
스레드 안전성은 여러 스레드가 동시에 같은 함수나 메서드를 호출해도 프로그램의 정확성이 보장되는 것을 의미합니다.
스레드 안전성을 확보하기 위해 락(lock)을 사용하거나 원자성을 보장하는 연산을 사용할 수 있습니다.
또한, 긴 시간 동안 스레드가 블로킹 상태로 머무르는 경우 다른 스레드의 실행을 방해할 수 있으므로, 이러한 경우에는 멀티프로세싱을 고려해야 합니다.
위에서 다룬 예제와 설명을 통해 파이썬에서 스레드를 생성하고 활용하는 방법에 대해 알아보았습니다.