2.1 threading
๋ชจ๋
Python์์์ ๋ฉํฐ์ค๋ ๋ฉ์ ์ฌ๋ฌ ์ค๋ ๋ (threads)
๋ฅผ ๋์์ ์คํํ ์ ์๋ ๋ฐฉ๋ฒ์ด๋ฉฐ, ํนํ ์
์ถ๋ ฅ ์์
์ด๋ ๋ณ๋ ฌ๋ก ์ํํ ์ ์๋ ์์
์์ CPU ์์์ ๋์ฑ ํจ์จ์ ์ผ๋ก ํ์ฉํ ์ ์๊ฒ ํด์ค.
Python์์ ๋ฉํฐ์ค๋ ๋ฉ์ ๊ธฐ๋ณธ ๊ฐ๋ :
์ค๋ ๋๋ ์คํ์ ์ต์ ๋จ์๋ก, ํ๋์ ํ๋ก์ธ์ค ๋ด์์ ๋ค๋ฅธ ์ค๋ ๋์ ๋ณ๋ ฌ๋ก ์๋ํ ์ ์์ด. ๋ชจ๋ ์ค๋ ๋๋ ํ๋์ ํ๋ก์ธ์ค ๋ด์ ์์ด์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ณต์ ํ๋ฉฐ, ์๋ก ๋ฐ์ดํฐ๋ฅผ ๊ตํํ ์ ์์ง.
ํ๋ก์ธ์ค๋ ์ด์ ์ฒด์ ์์ ๊ณ ์ ํ ์ฃผ์ ๊ณต๊ฐ๊ณผ ์์์ ๊ฐ์ง๊ณ ์คํ๋๋ ํ๋ก๊ทธ๋จ์ ์ธ์คํด์ค์ผ. ์ค๋ ๋์ ๋ค๋ฅด๊ฒ, ํ๋ก์ธ์ค๋ผ๋ฆฌ๋ ์๋ก ๊ฒฉ๋ฆฌ๋์ด ์๊ณ , ๋ฐ์ดํฐ๋ IPC(Inter-Process Communication)๋ฅผ ํตํด ๊ตํํด.
GIL
์ Python ์ธํฐํ๋ฆฌํฐ์ ๋ฉ์ปค๋์ฆ์ผ๋ก, ์ฌ๋ฌ Python ์ค๋ ๋๊ฐ ๋์์ ์คํ๋๋ ๊ฒ์ ๋ง์. GIL
์ Python ์ฝ๋์ ์์ ํ ์คํ์ ๋ณด์ฅํ์ง๋ง, ๋ฉํฐ์ฝ์ด ํ๋ก์ธ์์์ ๋ฉํฐ์ค๋ ๋ ํ๋ก๊ทธ๋จ์ ์ฑ๋ฅ์ ์ ํํด.
์ค์! Global Interpreter Lock (GIL) ๋๋ฌธ์, ๋ฉํฐ์ค๋ ๋ฉ์ด ๊ณ์ฐ ์ง์คํ ์์ ์ ๋ํด ์ฑ๋ฅ ํฅ์์ ํฌ๊ฒ ๋ณด์ฅํ์ง ๋ชปํ ์๋ ์๋ ์ ์ ๊ณ ๋ คํด์ผ ํด. GIL์ด ๋ฉํฐ์ฝ์ด ํ๋ก์ธ์์์ ์ฌ๋ฌ Python ์ค๋ ๋์ ๋์ ์คํ์ ๋ง๊ธฐ ๋๋ฌธ์ด์ผ.
threading
๋ชจ๋
Python์ threading
๋ชจ๋์ ์ค๋ ๋์ ์์
ํ๊ธฐ ์ํ ๊ณ ๊ธ ์ธํฐํ์ด์ค๋ฅผ ์ ๊ณตํด. ์ค๋ ๋๋ฅผ ์์ฑํ๊ณ ๊ด๋ฆฌํ๋ฉฐ, ์ด๋ค์ ๋๊ธฐํํ๊ณ ์ํธ์์ฉ์ ์กฐ์งํ ์ ์๊ฒ ํด์ค. ์ด ๋ชจ๋์ ์ฃผ์ ๊ตฌ์ฑ ์์์ ๊ธฐ๋ฅ์ ์ข ๋ ์์ธํ ์ดํด๋ณด์.
threading
๋ชจ๋์ ์ฃผ์ ๊ตฌ์ฑ ์์
์ค๋ ๋ ์์ ์ ์ํ ์ํฐํฐ:
-
Thread
โ ์ค๋ ๋ ์์ฑ ๋ฐ ๊ด๋ฆฌ์ ๊ธฐ๋ณธ ํด๋์ค. -
Timer
โ ์ง์ ๋ ์๊ฐ์ด ์ง๋๋ฉด ํจ์๋ฅผ ์คํํ๋ ํ์ด๋จธ. -
ThreadLocal
โ ์ค๋ ๋์ ๋ก์ปฌ ๋ฐ์ดํฐ๋ฅผ ์์ฑํ ์ ์๊ฒ ํด.
์ค๋ ๋ ๋๊ธฐํ ๋ฉ์ปค๋์ฆ:
-
Lock
โ ๊ณต์ฉ ์์์ ๋ํ ๋์ ์ ๊ทผ์ ๋ฐฉ์งํ๊ธฐ ์ํ ๋๊ธฐํ ํ๋ฆฌ๋ฏธํฐ๋ธ. -
Condition
โ ๋ณด๋ค ๋ณต์กํ ์ค๋ ๋ ๋๊ธฐํ๋ฅผ ์ํ ์กฐ๊ฑด ๋ณ์. Event
โ ์ค๋ ๋ ๊ฐ์ ์๋ฆผ์ ์ํ ํ๋ฆฌ๋ฏธํฐ๋ธ.-
Semaphore
โ ํน์ ๊ตฌ์ญ์ ๋์์ ์คํํ ์ ์๋ ์ค๋ ๋ ์๋ฅผ ์ ํํ๋ ํ๋ฆฌ๋ฏธํฐ๋ธ. -
Barrier
โ ์ค์ ๋ ์์ ์ค๋ ๋๋ฅผ ๋๊ธฐํํ์ฌ, ๋ชจ๋ ์ค๋ ๋๊ฐ ๋๋ฌํ ๋๊น์ง ์ฐจ๋จํจ.
์๋์์ ์ค๋ ๋์ ์์ ํ ์ ์๋ 3๊ฐ์ง ํด๋์ค๋ฅผ ์ค๋ช ํ ๊ฑฐ์ผ. ๋๊ธฐํ ๋ฉ์ปค๋์ฆ์ ๋น๋ถ๊ฐ ํ์ ์์ ๊ฑฐ์ผ.
2.2 Thread
ํด๋์ค
Thread
ํด๋์ค๋ ์ค๋ ๋ ์์ฑ ๋ฐ ๊ด๋ฆฌ์ ๊ธฐ๋ณธ ํด๋์ค์ผ. ์ด ํด๋์ค์๋ 4๊ฐ์ง ์ฃผ์ ๋ฉ์๋๊ฐ ์์ด:
start()
: ์ค๋ ๋ ์คํ์ ์์ํด.-
join()
: ํ์ฌ ์ค๋ ๋๊ฐ ๋๊ธฐํ๊ณ , ์คํ๋ ์ค๋ ๋๊ฐ ์๋ฃ๋ ๋๊น์ง ๊ธฐ๋ค๋ ค. is_alive()
: ์ค๋ ๋๊ฐ ์คํ ์ค์ด๋ผ๋ฉดTrue
๋ฅผ ๋ฐํํด.-
run()
: ์ค๋ ๋์์ ์คํํ ์ฝ๋๋ฅผ ํฌํจํ ๋ฉ์๋.Thread
ํด๋์ค๋ฅผ ์์๋ฐ์ ์ฌ์ ์ํ ์ ์์ด.
ํจ์ฌ ๋ ๊ฐ๋จํด ๋ณด์ด๋ Thread
ํด๋์ค์ ์ฌ์ฉ ์์ .
๊ฐ๋จํ ์ค๋ ๋ ์์
import threading
def worker():
print("Worker thread is running")
# ์ ์ค๋ ๋ ์์ฑ
t = threading.Thread(target=worker) #์ ์ค๋ ๋ ๊ฐ์ฒด๋ฅผ ์์ฑํ์ด
t.start() # ์ค๋ ๋ ์์
t.join() # ์ค๋ ๋ ์๋ฃ ๋๊ธฐ
print("Main thread is finished")
start ๋ฉ์๋๋ฅผ ํธ์ถํ ํ, ํจ์ worker๊ฐ ์คํ๋ ๊ฑฐ์ผ. ์ข ๋ ์ ํํ ๋งํ๋ฉด, ์ค๋ ๋๊ฐ ํ์ฑ ์ค๋ ๋ ๋ชฉ๋ก์ ์ถ๊ฐ๋ ๊ฑฐ์ผ.
์ธ์ ์ฌ์ฉ
import threading
def worker(number, text):
print(f"Worker {number}: {text}")
# ์ธ์๊ฐ ์๋ ์ ์ค๋ ๋ ์์ฑ
t = threading.Thread(target=worker, args=(1, "Hello"))
t.start()
t.join()
์ ์ค๋ ๋์ ๋งค๊ฐ๋ณ์๋ฅผ ์ ๋ฌํ๋ ค๋ฉด, ๋จ์ํ ํํ ํํ๋ก args
๋งค๊ฐ๋ณ์์ ์ง์ ํด ์ค ํ์๊ฐ ์์ด. target
์ ์ง์ ๋ ํจ์๊ฐ ํธ์ถ๋ ๋, ๋งค๊ฐ๋ณ์๋ ์๋์ผ๋ก ์ ๋ฌ๋ ๊ฑฐ์ผ.
๋ฉ์๋ run
์ฌ์ ์
import threading
class MyThread(threading.Thread):
def run(self):
print("Custom thread is running")
# ์ค๋ ๋ ์์ฑ ๋ฐ ์์
t = MyThread()
t.start()
t.join()
์๋ก์ด ์ค๋ ๋๋ฅผ ์์ํ ํจ์๋ ๋ ๊ฐ์ง ๋ฐฉ๋ฒ์ผ๋ก ์ง์ ํ ์ ์์ด โ Thread
๊ฐ์ฒด๋ฅผ ์์ฑํ ๋ target
๋งค๊ฐ๋ณ์๋ฅผ ํตํด ์ ๋ฌํ๊ฑฐ๋, Thread
ํด๋์ค๋ฅผ ์์๋ฐ์ run
ํจ์๋ฅผ ์ฌ์ ์ํ๋ ๊ฑฐ์ผ. ๋ ๊ฐ์ง ๋ฐฉ๋ฒ ๋ชจ๋ ํฉ๋ฒ์ ์ด๊ณ ์์ฃผ ์ฌ์ฉ๋ผ.
2.3 Timer
ํด๋์ค
threading
๋ชจ๋์ Timer
ํด๋์ค๋ ์ง์ ๋ ์๊ฐ ํ์ ํจ์๋ฅผ ์คํํ๊ธฐ ์ํ ๋ชฉ์ ์ด์ผ. ์ด ํด๋์ค๋ ๋ฉํฐ์ค๋ ๋ฉ ํ๊ฒฝ์์ ์ง์ฐ๋ ์์
์ ์คํํ๋ ๋ฐ ์ ์ฉํ์ง.
ํ์ด๋จธ๋ ํธ์ถํ ํจ์์ ์ด ๋จ์์ ์ง์ฐ ์๊ฐ์ผ๋ก ์์ฑ ๋ฐ ์ด๊ธฐํ๋ผ.
-
๋ฉ์๋
start()
๋ ํ์ด๋จธ๋ฅผ ์์ํ๊ณ , ์ง์ ๋ ์๊ฐ์ด ์ง๋๋ฉด ์ฃผ์ด์ง ํจ์๋ฅผ ํธ์ถํด. -
๋ฉ์๋
cancel()
์ ํ์ด๋จธ๊ฐ ์์ง ์คํ๋์ง ์์์ ๋ ํ์ด๋จธ๋ฅผ ๋ฉ์ถ ์ ์์ด. ํ์ด๋จธ๊ฐ ๋ ์ด์ ํ์ํ์ง ์์ ๊ฒฝ์ฐ์ ํจ์๋ฅผ ์คํํ์ง ์๋๋ก ๋ฐฉ์งํ๋๋ฐ ์ ์ฉํ์ง.
์ฌ์ฉ ์์ :
์ง์ฐ ์คํ ํจ์
์ด ์์ ์์๋ ํ์ด๋จธ๊ฐ ์์๋ ํ 5์ด ๋ค์ hello
ํจ์๊ฐ ํธ์ถ๋์ด.
import threading
def hello():
print("Hello, world!")
# 5์ด ๋ค์ hello ํจ์๋ฅผ ํธ์ถํ ํ์ด๋จธ ์์ฑ
t = threading.Timer(5.0, hello)
t.start() # ํ์ด๋จธ ์์
์คํ ์ ์ ํ์ด๋จธ ๋ฉ์ถ๊ธฐ
์ฌ๊ธฐ์๋ hello
ํจ์๊ฐ ์คํ๋๊ธฐ ์ ์ ํ์ด๋จธ๊ฐ ๋ฉ์ถ๊ธฐ ๋๋ฌธ์ ์๋ฌด๊ฒ๋ ์ถ๋ ฅ๋์ง ์์.
import threading
def hello():
print("Hello, world!")
# ํ์ด๋จธ ์์ฑ
t = threading.Timer(5.0, hello)
t.start() # ํ์ด๋จธ ์์
# ์คํ ์ ์ ํ์ด๋จธ ๋ฉ์ถ๊ธฐ
t.cancel()
์ธ์ ์๋ ํ์ด๋จธ
์ด ์์ ์์๋ ํ์ด๋จธ๊ฐ 3์ด ํ์ greet
ํจ์๋ฅผ ํธ์ถํ๊ณ ์ธ์ "Alice"
๋ฅผ ์ ๋ฌํด.
import threading
def greet(name):
print(f"Hello, {name}!")
# ์ธ์ ์๋ ํ์ด๋จธ ์์ฑ
t = threading.Timer(3.0, greet, args=["Alice"])
t.start()
Timer
ํด๋์ค๋ ์ผ์ ์๊ฐ ํ์ ์์
์ ๊ณํํ๋ ๋ฐ ํธ๋ฆฌํด. ๋ค๋ง ํ์ด๋จธ๋ ์์
์คํ์ ์ ๋์ ์ธ ์ ํ์ฑ์ ๋ณด์ฅํ์ง๋ ์์, ์์คํ
๋ถํ์ ์ค๋ ๋ ์ค์ผ์ค๋ฌ ์๋์ ๋ฐ๋ผ ๋ค๋ฅด์ง.
2.4 ThreadLocal
ํด๋์ค
ThreadLocal
ํด๋์ค๋ ๊ฐ ์ค๋ ๋๋ง๋ค ๊ณ ์ ํ ๋ก์ปฌ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ง๋๋ก ํ๊ธฐ ์ํ ํด๋์ค๋ก, ๋ฉํฐ์ค๋ ๋ ์ ํ๋ฆฌ์ผ์ด์
์์ ๊ฐ ์ค๋ ๋๊ฐ ์ถฉ๋ ์์ด ์์ ์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ผ ํ ๋ ์ ์ฉํด.
ThreadLocal
์ ์ฌ์ฉํ๋ ๋ชจ๋ ์ค๋ ๋์๋ ์์ ๋ง์ ๊ณ ์ ํ ๋ฐ์ดํฐ ์ฌ๋ณธ์ด ์์ด. ThreadLocal
๊ฐ์ฒด์ ์ ์ฅ๋ ๋ฐ์ดํฐ๋ ๊ฐ ์ค๋ ๋๋ง๋ค ๋
๋ฆฝ์ ์ด๊ณ ๋ค๋ฅธ ์ค๋ ๋์ ๊ณต์ ๋์ง ์์. ํ์ฌ ์น ์ ํ๋ฆฌ์ผ์ด์
์ ์ฌ์ฉ์๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ํ์ฌ ์ฐ๊ฒฐ ๋ฑ ํน์ ์ค๋ ๋ ๋ด์์๋ง ์ฌ์ฉํ๋ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ธฐ์ ์ข์ง.
์ฌ์ฉ ์์ :
๊ธฐ๋ณธ ์ฌ์ฉ
์ด ์์ ์์๋ ๊ฐ ์ค๋ ๋๊ฐ ๋ก์ปฌ ๋ณ์ value
์ ์์ ์ ์ด๋ฆ์ ํ ๋นํ๊ณ ์ถ๋ ฅํด. value
์ ๊ฐ์ ๊ฐ ์ค๋ ๋๋ง๋ค ์ ์ผํด.
import threading
# ThreadLocal ๊ฐ์ฒด ์์ฑ
local_data = threading.local()
def process_data():
# ์ค๋ ๋ ๋ก์ปฌ ๋ณ์์ ๊ฐ ํ ๋น
local_data.value = threading.current_thread().name
# ์ค๋ ๋ ๋ก์ปฌ ๋ณ์์ ์ ๊ทผ
print(f'Value in {threading.current_thread().name}: {local_data.value}')
threads = []
for i in range(5):
t = threading.Thread(target=process_data)
threads.append(t)
t.start()
for t in threads:
t.join()
์น ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ฌ์ฉ์ ๋ฐ์ดํฐ ์ ์ฅ
์ด ์์ ์์๋ ๊ฐ ์ค๋ ๋๊ฐ ์ฌ์ฉ์ ์์ฒญ์ ์ฒ๋ฆฌํด. user_data.user
๊ฐ์ ๊ฐ ์ค๋ ๋๋ง๋ค ์ ์ผํด.
import threading
# ThreadLocal ๊ฐ์ฒด ์์ฑ
user_data = threading.local()
def process_request(user):
# ์ค๋ ๋ ๋ก์ปฌ ๋ณ์์ ๊ฐ ํ ๋น
user_data.user = user
handle_request()
def handle_request():
# ์ค๋ ๋ ๋ก์ปฌ ๋ณ์์ ์ ๊ทผ
print(f'Handling request for user: {user_data.user}')
threads = []
users = ['Alice', 'Bob', 'Charlie']
for user in users:
t = threading.Thread(target=process_request, args=(user,))
threads.append(t)
t.start()
for t in threads:
t.join()
์ด๊ฒ threading
๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ๊ฐ์ฅ ์ ์ฉํ 3๊ฐ์ง ํด๋์ค์์ด. ์๋ง๋ ์ด ํด๋์ค๋ฅผ ์ฌ์ฉํด์ ์์
ํ ๊ฐ๋ฅ์ฑ์ด ํฌ์ง๋ง, ๋๋จธ์ง ํด๋์ค๋ ์๋ง๋ ๊ฑฐ์ ์ฌ์ฉํ ์ผ์ด ์์ ๊ฑฐ์ผ. ์์ฆ ๋ชจ๋๊ฐ ๋น๋๊ธฐ ํจ์์ asyncio
๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก ์ ํํ๊ณ ์์ด. ์์ผ๋ก๋ ์ด asyncio
๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ํด ๊ณ์ ์ด์ผ๊ธฐํ ๊ฑฐ์ผ.
GO TO FULL VERSION