from threading import Thread
threading λͺ¨λμ μ¬μ©νμ¬ λ©ν°μ€λ λ©μ ꡬνν μ μλ€. (I/O λ°μ΄λ μμ
μ μ ν©)
Thread ν΄λμ€λ κ°κ° λ
립μ μΈ μ€λ λλ₯Ό λνλ΄λ ν΄λμ€μ΄λ€. Thread μΈμ€ν΄μ€λ₯Ό μμ±νκ³ , μ΄λ₯Ό μμνλ κ²μΌλ‘ μλ‘μ΄ μ€λ λλ₯Ό μμ±νκ³ μ€νν μ μλ€.
from threading import Thread
def print_func(num):
for i in range(num):
print("Print number %d" % i)
if __name__ == "__main__":
t = Thread(target=print_func, args=(5,)) # Thread μΈμ€ν΄μ€ μμ±
t.start() # μλ‘μ΄ μ€λ λ μμ
t.join() # μ€λ λμ μ’
λ£λ₯Ό κΈ°λ€λ¦Ό
Python
볡μ¬
β’
start(): μ€λ λλ₯Ό μμνλ€. μ€λ λμ target ν¨μκ° μ€νλλ€.
β’
join(): μ€λ λκ° μ’
λ£λ λκΉμ§ κΈ°λ€λ¦°λ€. μ΄ λ©μλλ₯Ό νΈμΆνλ μ€λ λλ join()μ΄ νΈμΆλ μ€λ λκ° μ’
λ£λ λκΉμ§ μ€νμ μΌμ μ€μ§νλ€.
μ΄ μ½λλ μλ‘μ΄ μ€λ λλ₯Ό μμ±νμ¬ print_func ν¨μλ₯Ό μ€ννλ€. μ΄ ν¨μλ μ λ¬λ°μ μλ§νΌ μ«μλ₯Ό μΆλ ₯νλ€. μ΄μ²λΌ threading λͺ¨λκ³Ό Thread ν΄λμ€λ₯Ό μ¬μ©νλ©΄, μ¬λ¬ μ€λ λλ₯Ό λμμ μ€ννλ λ©ν°μ€λ λ©μ μ½κ² ꡬνν μ μλ€.
Daemon Thread
μ£Ό μ€λ λ(main)κ° νλ‘κ·Έλ¨μ λͺ¨λ λ°λͺ¬μ΄ μλ μ€λ λκ° μ’
λ£λ λκΉμ§ κΈ°λ€λ¦° νμ μ’
λ£νλ λ°λ©΄, λ°λͺ¬ μ€λ λμ λν΄μλ μ΄λ¬ν λκΈ° μμ΄ μ£Ό μ€λ λκ° μ’
λ£λλ©΄ μ¦μ μ’
λ£λλ€.
λ°λͺ¬ μ€λ λλ₯Ό μμ±ν λ Thread μμ±μμ daemon=Trueλ₯Ό μΆκ°νμ¬ μ€μ ν μ μλ€
import threading
# μ€λ λ μ€ν ν¨μ
def thread_func(name, d):
for i in d:
print(i)
# λ©μΈ μμ
if __name__ == "__main__":
x = threading.Thread(target=thread_func, args=('First', range(20000)), daemon=True)
y = threading.Thread(target=thread_func, args=('Second', range(10000)), daemon=True)
# μλΈ μ€λ λ μμ
x.start()
y.start()
# DaemonThread νμΈ
print(x.isDaemon())
Python
볡μ¬
β’
μ€λ λ xλ 0 β 1 β 2 β 3 β 4λ₯Ό μΆλ ₯
β’
μ€λ λ yλ 0 β 1 μ μΆλ ₯
β’
print(x.isDaemon())μ Trueλ₯Ό μΆλ ₯
κ·Έλ¬λ μ£Ό μ€λ λ(main thread)κ° λλκ² λλ©΄μ μλμΌλ‘ μ’
λ£λ¨
μ€λ λ xμ yμ μΆλ ₯ μμλ μμΈ‘ν μ μλ€. μλνλ©΄ μ΄λ μ΄μ 체μ μ μ€λ λ μ€μΌμ€λ§μ μν΄ κ²°μ λκΈ° λλ¬Έμ΄λ€. λ°λΌμ xμ yμ μΆλ ₯ μμλ μ€νν λλ§λ€ λ€λ₯΄κ² λμ¬ μ μλ€.
Pythonμ GIL λλ¬Έμ CPU λ°μ΄λ μμ
μ λ³λ ¬ μ²λ¦¬μλ μ νμ μ΄λ―λ‘, CPU λ°μ΄λ μμ
μ λ©ν°νλ‘μΈμ± λͺ¨λμ μ¬μ©νλ κ²μ΄ λ°λμ§νλ€.