About me
home
Portfolio
home
🧡

Thread module

λ‚ μ§œ
2023/07/19
νƒœκ·Έ
파이썬
이둠

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
볡사
데λͺ¬μŠ€λ ˆλ“œ.py
0.6KB
β€’
μŠ€λ ˆλ“œ xλŠ” 0 β†’ 1 β†’ 2 β†’ 3 β†’ 4λ₯Ό 좜λ ₯
β€’
μŠ€λ ˆλ“œ yλŠ” 0 β†’ 1 을 좜λ ₯
β€’
print(x.isDaemon())은 Trueλ₯Ό 좜λ ₯
κ·ΈλŸ¬λ‚˜ μ£Ό μŠ€λ ˆλ“œ(main thread)κ°€ λλ‚˜κ²Œ λ˜λ©΄μ„œ μžλ™μœΌλ‘œ μ’…λ£Œλ¨
μŠ€λ ˆλ“œ x와 y의 좜λ ₯ μˆœμ„œλŠ” μ˜ˆμΈ‘ν•  수 μ—†λ‹€. μ™œλƒν•˜λ©΄ μ΄λŠ” 운영 체제의 μŠ€λ ˆλ“œ μŠ€μΌ€μ€„λ§μ— μ˜ν•΄ κ²°μ •λ˜κΈ° λ•Œλ¬Έμ΄λ‹€. λ”°λΌμ„œ x와 y의 좜λ ₯ μˆœμ„œλŠ” μ‹€ν–‰ν•  λ•Œλ§ˆλ‹€ λ‹€λ₯΄κ²Œ λ‚˜μ˜¬ 수 μžˆλ‹€.
Python의 GIL λ•Œλ¬Έμ— CPU λ°”μš΄λ“œ μž‘μ—…μ˜ 병렬 μ²˜λ¦¬μ—λŠ” μ œν•œμ μ΄λ―€λ‘œ, CPU λ°”μš΄λ“œ μž‘μ—…μ€ λ©€ν‹°ν”„λ‘œμ„Έμ‹± λͺ¨λ“ˆμ„ μ‚¬μš©ν•˜λŠ” 것이 λ°”λžŒμ§ν•˜λ‹€.