E D R , A S I H C RSS

Python Thread Programming


1. μ°Έκ³  μ‚¬μ΄νŠΈ

2. κΈ°λ³Έ

  • μ•„λž˜λŠ” κ°„λ‹¨ν•˜κ²Œ μ“°λ ˆλ“œ ν•˜λ‚˜λΌ μƒμ„±ν•˜λŠ” 예제

~cpp
import time
import thread

def myfunction(string,sleeptime,*args):
    while 1:
       
        print string
        time.sleep(sleeptime) #sleep for a specified amount of time.

if __name__=="__main__":

    thread.start_new_thread(myfunction,("Thread No:1",2))

    while 1:pass

2.1. Lock

  • lock이 μ™œ ν•„μš”ν•˜λ‚˜? -> ν•˜λ‚˜μ˜ 곡용 μžμ›μ„ μ—¬λŸ¬ μŠ€λ ˆλ“œκ°€ λ™μ‹œμ— μ‚¬μš©ν•˜λ©΄ λ¬Έμ œκ°€ μƒκΈΈμˆ˜ μžˆλ‹€. κ·Έλž˜μ„œ κ³΅μš©μžμ›μ„ μ‚¬μš©ν• λ•ŒλŠ” 락을 κ±Έκ³  μ‚¬μš©ν•˜κ³  μ‚¬μš©ν•˜κ³  λ‚˜μ„œλŠ” 락을 ν‘Όλ‹€.
    • 문제 상황 예 : count λ³€μˆ˜λΌ κ° μ“°λ ˆλ“œλ“€μ΄ 1식 μ¦κ°€λΌ μ‹œν‚€λŠ”λ° ν•œ μŠ€λ ˆλ“œκ°€ 증가 μ‹œν‚€λŠ” λ™μ•ˆ λ‹€λ₯Έ μŠ€λ ˆλ“œλ„ λ™μ‹œμ— 증가 μ‹œν‚€λ‹€ 보면 μ›λž˜ 2 증가 ν•΄μ•Όν•˜λŠ”λ° 1증가 ν•˜λŠ” μˆ˜κ°€ 생긴닀..

~cpp
import time
import thread

def myfunction(string,sleeptime,lock,*args):
    while 1:
	#entering critical section
        lock.acquire() 
        print string," Now Sleeping after Lock acquired for ",sleeptime
        time.sleep(sleeptime) 
        print string," Now releasing lock and then sleeping again"
        lock.release()
	#exiting critical section
        time.sleep(sleeptime) # why?

if __name__=="__main__":

    lock=thread.allocate_lock()
    thread.start_new_thread(myfunction,("Thread No:1",2,lock))
    thread.start_new_thread(myfunction,("Thread No:2",2,lock))

    while 1:pass
  • μœ„ μ†ŒμŠ€μ—μ„œ why λΆ€λΆ„,, μ™œ sleep을 λ„£μ—ˆμ„κΉŒ?(λ§Œμ•½ 저것을 λΉΌλ©΄ ν•œμ“°λ ˆλ“œκ°€ μžμ›μ„ λ…μ ν•˜κ²Œ λœλ‹€) -> Python 은 threadsafe ν•˜μ§€ μ•Šλ‹€. Pythonμ—μ„œλŠ” μžλ°”μ²˜λŸΌ μŠ€λ ˆλ“œκ°€ λ¬Έλ²•μ˜ μ€‘μš”ν•œ μœ„μΉ˜λΌ μ°¨μ§€ν•˜κ³  μžˆμ§€ μ•Šλ‹€. 그것보닀 이식 κ°€λŠ₯성을 더 μ€‘μš”ν•˜κ²Œ μƒκ°ν•œλ‹€.
  • λͺ¨λ“  built-in ν•¨μˆ˜κ°€ λ‹€λ₯Έ μ“°λ ˆλ“œκ°€ μ‹€ν–‰ν• μˆ˜ μžˆλ„λ‘ I/O에 λŒ€ν•œ block waiting 을 ν•˜λŠ” 것은 μ•„λ‹ˆλ‹€.(time.sleep(), file.read(), select.select()) 은 μ˜ˆμƒλŒ€λ‘œ μž‘λ™ν•œλ‹€)
  • lock μƒνƒœμ— μžˆλŠ” acquire() ν•¨μˆ˜μ— λŒ€ν•˜μ—¬ interrupt ν•˜λŠ”κ²ƒμ€ κ°€λŠ₯ν•˜μ§€ μ•Šλ‹€. (ν‚€λ³΄λ“œ μΈν„°λŸ½νŠΈλ„ lock을 μ–»κ³  λ‚˜μ„œμ•Ό μΌμ–΄λ‚œλ‹€.)
  • κ·Έλž˜μ„œ μ•„λž˜μ™€ 같은 μ†ŒμŠ€λŠ” starvation을 μΌμœΌν‚¨λ‹€.

~cpp
hile 1:
	lock.acquire()
	.....
	#some operation
	.....
	lock.release()

----
Python
Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2021-02-07 05:24:08
Processing time 0.0120 sec