티스토리 뷰

Python 잡지식

Python의 Thread1

Teus 2021. 3. 9. 08:00
728x90
반응형

 

https://docs.python.org/ko/3/library/threading.html

 

threading — 스레드 기반 병렬 처리 — Python 3.9.6 문서

threading — 스레드 기반 병렬 처리 소스 코드: Lib/threading.py 이 모듈은 저수준 _thread 모듈 위에 고수준 스레딩 인터페이스를 구축합니다. queue 모듈도 참조하십시오. 버전 3.7에서 변경: 이 모듈은

docs.python.org

이번 포스팅은 Thread에 대한 내용입니다.

 

Thread란 Python뿐만 아니라, 대부분의 모든 언어에서 지원하는

 

병렬처리를 위한 프로그래밍 입니다.

 

아래 간단한 이미지를 보시죠

작업의 진행(직렬)

일반적으로, Main Flow가 흘러가면서 순차적으로 작업을 진행합니다.

 

이때, 작업1과 작업2, 작업3이 독립적이면, 아래와같은것이 가능합니다.

작업의 진행(병렬)

하지만, 잘 생각해봅시다. 작업을 할 수 있는 Core가 1개라면

 

어차피 작업을 직렬작업이나 병렬작업이나 어차피 걸리는 시간을 동일합니다.

(어차피 CPU가 1개면 시간을 나눠서 진행합니다)

Core가 1개일 경우 작업 스케쥴링

이때 중요한점.

Python 이외에 C/C++, Java 등 다른 언어에서는 Posix Thread(국제표준 Thread 오픈소스)를 기반으로 하기 때문에

CPU가 늘어나면, CPU 가상Core에 맞게 작업을 배분합니다.

 

하지만, Python같은 경우는, GIL(Global Interpreter Lock)이라는 정책이 있어서, Thread를 사용할 경우 Input/Output 작은 동시에 병렬처리가 가능하지만, CPU 연산 작업은 동시에 1개로 제한됩니다.

https://wiki.python.org/moin/GlobalInterpreterLock

 

GlobalInterpreterLock - Python Wiki

In CPython, the global interpreter lock, or GIL, is a mutex that protects access to Python objects, preventing multiple threads from executing Python bytecodes at once. The GIL prevents race conditions and ensures thread safety. A nice explanation of how t

wiki.python.org

 

아래는 n번의 더하기 작업을 Threadㄹ 나눠서 or 직렬작업으로 진행한 코드 및 결과입니다.

 

보시면 알겠지만, Thread로 나뉘어 실행한것과 직렬처리 결과는 사실상 큰 차이가 없는것을 알 수 있습니다.

import threading
import time
def foo(n):
    for k in range(4):
        temp = 0
        for i in range(n):
            temp += 1
    print("work_end")
    print(temp)
        
def foo_thread(n):
    temp = 0
    for i in range(n):
        temp += 1
    output_str = str(threading.get_native_id())+"work end"
    print(output_str)

start = time.time()       
th = [threading.Thread(target = foo_thread, args = (10000000,)) for i in range(4)]
for i in th:
    i.start()
for i in th:
    i.join()
print("time :", time.time() - start)

start = time.time()   
foo(10000000)
print("time :", time.time() - start)


out:
#4개의 Thread를 만들어서 실행한 결과
1668work end
8372work end
3924work end
7296work end
time : 3.5046191215515137

#직렬 작업으로 진행한 결과
work_end
10000000
time : 3.237943649291992

 

그러면 I/O 작업 이외에 작업의 속도가 빨리지지 않는데, 어떠한 부분에서 활용이 가능할까요?

 

다음 포스팅에서 Thread를 사용한 예시에 대해서 다룹니다.

https://teus-kiwiee.tistory.com/71?category=922602 

 

Event Listener의 정체

이번 포스팅은 Event Listener의 정체입니다. 많은분들이 코딩을 배우면서, 반응형 System(Web, Application...)을 배우면서 Event Listener에 대해서 배우게 됩니다. Event Listener는 Event(사용자의 Click or..

teus-kiwiee.tistory.com

 

728x90
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함