Thread ì�˜ ì •ì�˜ ¶
ì“°ë ˆë“œëŠ” 하나ì�˜ 프로그램(프로세스)안ì—�서 여러가지 ì�¼ì�„ ë�™ì‹œì—� 처리해 주는 것ì�„ ë§�합니다.
쉬운 예로 게임ì�„ í• ë•Œ ë°°ê²½ì�Œì•…ì�´ 나오면서ë�„ ìº�ë¦í„°ê°€ 움ì§�ì�´ê³ 배경화면 ì¶œë ¥ë�¨. 즉 ì�¼ì�´ ë�™ì‹œì—� 처리ë� 때 ê°�ê°�ì�˜ ì�¼ë“¤ì�„ ì“°ë ˆë“œë�¼ê³ 합니다.~~!
쉬운 예로 게임ì�„ í• ë•Œ ë°°ê²½ì�Œì•…ì�´ 나오면서ë�„ ìº�ë¦í„°ê°€ 움ì§�ì�´ê³ 배경화면 ì¶œë ¥ë�¨. 즉 ì�¼ì�´ ë�™ì‹œì—� 처리ë� 때 ê°�ê°�ì�˜ ì�¼ë“¤ì�„ ì“°ë ˆë“œë�¼ê³ 합니다.~~!
ì°¸ê³ )
프로세스(process) : ì“°ë ˆë“œì™€ 비슷하기는 하지만 좀 ë�” í�° ê°œë…�ì�„ ë§�하는ë�°, 서로 다른 프로그램ì�´ ë�™ì‹œì—� 처리ë� ê°�ê°�ì�˜ 프로그램ì�„ 가리킴니다..
하나ì�˜ 프로세스가 여러개ì�˜ ì“°ë ˆë“œë¡œ ì�´ë£¨ì–´ 질 수 있는 것입니다.
프로세스(process) : ì“°ë ˆë“œì™€ 비슷하기는 하지만 좀 ë�” í�° ê°œë…�ì�„ ë§�하는ë�°, 서로 다른 프로그램ì�´ ë�™ì‹œì—� 처리ë� ê°�ê°�ì�˜ 프로그램ì�„ 가리킴니다..
하나ì�˜ 프로세스가 여러개ì�˜ ì“°ë ˆë“œë¡œ ì�´ë£¨ì–´ 질 수 있는 것입니다.
Thread 모듈 ¶
ì“°ë ˆë“œë¥¼ ì‚¬ìš©í•˜ë ¤ë©´ : ì“°ë ˆë“œë¡œ ì²˜ë¦¬í• ë¶€ë¶„ì�„ 함수로 ë§Œë“¤ì–´ì£¼ê³ start_new_thread()로 ê·¸ 함수로 호출하면 ë�©ë‹ˆë‹¤.
예시1 ¶
~cpp
import thread
i=0
j=0
def f():
global i
while 1: i+=1
def g():
global j
while 1: j+=1
thread.start_new_thread(f,())
thread.start_new_thread(g,())
print 'i=',i
print 'j=',j
print 'i=',i
print 'j=',j
예시2 ¶
~cpp
import thread, time
def counter(id):
for i in range(5):
print 'id %s --> %s' % (id, i)
time.sleep(0.1)
for i in range(5):
thread.start_new_thread( counter, (i,) )
# 5ê°œì�˜ ì“°ë ˆë“œë¥¼ ë�…립ì �으로 ê°�ê°�실행
time.sleep(2) # ìž ì‹œëŒ€ê¸°
print 'Exiting'
변수ì�˜ ê³µìœ ¶
- ì“°ë ˆë“œì�˜ 좋ì�€ ì �ì�€ ì „ì— ë³€ìˆ˜ë¥¼ ê³µìœ í• ìˆ˜ 있다는 ì �ì�´ë‹¤.
만약 여러 ì“°ë ˆë“œê°€ 한 변수를 ë�™ì‹œì—� ë³€ê²½í•˜ë ¤ê³ í• ë•Œ ë¬¸ì œê°€ ìƒ�길 수 있다.
ê°’ì�„ ê°±ì‹ í•˜ë ¤ 하는 중간ì—� 다른 ìŠ¤ë ˆë“œë¡œ êµ�ì²´ë�˜ë©´ 바르지 못한 ì •ë³´ê°€ ìƒ�길경우가 있기 때문ì�´ë‹¤.
예3 ¶
~cpp
import thread, time
g_count = 0
def counter(id, count):
global g_count
for i in range(count):
print 'id %s -> %s' % (id, i)
g_count = g_count +1
for i in range(5):
thread.start_new_thread(counter,(i,5))
time.sleep(3)
print 'Total Counter =', g_count
print 'Exitintg'
(ìƒ�í˜¸ë°°ì œ)
ì�´ì™€ ê°™ì�€ ë¬¸ì œì �ì�„ í•´ê²°ì�„ 위해서 ì •ë³´ë¥¼ ê°±ì‹ í•˜ëŠ” ë�™ì•ˆì—�는 다른 ì“°ë ˆë“œê°€ 그변수ì—� ì ‘ê·¼í•˜ì§€ 못하ë�„ë¡� 하는 것ì�´ í•„ìš”~!
allow_lock() 함수는 새로운 � �체를 넘겨준다.(3)
1. thread.acquire() - ë�½ì�„ 얻는다. ì�¼ë‹¨ 하나ì�˜ ì“°ë ˆë“œê°€ ë�½ì�„ 얻으면 다른 ì“°ë ˆë“œëŠ” ë�½ì�„ ì–»ì�„수 없다.
2. thread.release() - ë�½ì�„ í•´ì œí•œë‹¤. 다른 ì“°ë ˆë“œê°€ ì�´ 코드 ì˜�ì—으로 들어갈 수 있는 것ì�„ í—ˆë�½í•˜ëŠ” 것ì�´ë‹¤.
3. thread.locked() - �� 얻었으면 1, 아니면 0� 리턴.
ì�´ì™€ ê°™ì�€ ë¬¸ì œì �ì�„ í•´ê²°ì�„ 위해서 ì •ë³´ë¥¼ ê°±ì‹ í•˜ëŠ” ë�™ì•ˆì—�는 다른 ì“°ë ˆë“œê°€ 그변수ì—� ì ‘ê·¼í•˜ì§€ 못하ë�„ë¡� 하는 것ì�´ í•„ìš”~!
allow_lock() 함수는 새로운 � �체를 넘겨준다.(3)
1. thread.acquire() - ë�½ì�„ 얻는다. ì�¼ë‹¨ 하나ì�˜ ì“°ë ˆë“œê°€ ë�½ì�„ 얻으면 다른 ì“°ë ˆë“œëŠ” ë�½ì�„ ì–»ì�„수 없다.
2. thread.release() - ë�½ì�„ í•´ì œí•œë‹¤. 다른 ì“°ë ˆë“œê°€ ì�´ 코드 ì˜�ì—으로 들어갈 수 있는 것ì�„ í—ˆë�½í•˜ëŠ” 것ì�´ë‹¤.
3. thread.locked() - �� 얻었으면 1, 아니면 0� 리턴.
lock = thread.allocate_lock() #여기서 ì–»ì�€ lock는 ëª¨ë“ ì“°ë ˆë“œê°€ ê³µìœ í•´ì•¼ 한다. (->ì „ì—)
# ì“°ë ˆë“œì�˜ ì½”ë“œìˆ˜í–‰ê³¼ì •
lock.acquire() #ë�½ì�„ ì–»ê³ ë“¤ì–´ê°„ë‹¤. ì�´ë¯¸ 다른 ì“°ë ˆë“œê°€ 들어가 있으면 ë�½ì�„ ì–»ì�„때까지 여기서 ìž�ë�™ì �ì�„ 대기.
g_count = g_count+1 #필요한 코드 수행
lock.release() #ë�½ì�„ í•´ì œ. 다른 ì“°ë ˆë“œê°€ ㅇ코드ì˜�ì—으로 들어갈 수 있ë�„ë¡� í—ˆë�½í•œë‹¤.
# ì“°ë ˆë“œì�˜ ì½”ë“œìˆ˜í–‰ê³¼ì •
lock.acquire() #ë�½ì�„ ì–»ê³ ë“¤ì–´ê°„ë‹¤. ì�´ë¯¸ 다른 ì“°ë ˆë“œê°€ 들어가 있으면 ë�½ì�„ ì–»ì�„때까지 여기서 ìž�ë�™ì �ì�„ 대기.
g_count = g_count+1 #필요한 코드 수행
lock.release() #ë�½ì�„ í•´ì œ. 다른 ì“°ë ˆë“œê°€ ㅇ코드ì˜�ì—으로 들어갈 수 있ë�„ë¡� í—ˆë�½í•œë‹¤.
예4 ¶
~cpp
import thread, time
g_count = 0
lock = thread.allocate_lock()
def counter(id, count):
global g_count
for i in range(count):
print 'id %s -> %s' % (id, i)
lock.acquire()
g_count = g_count +1
lock.release()
for i in range(5):
thread.start_new_thread(counter,(i,5))
time.sleep(3)
print 'Total Counter =', g_count
print 'Exitintg'
~cpp
from Tkinter import *
import time, thread
def CountTime():
global i
i=0
count=0
while count<80:
text.insert(1.0, i)
text.delete(INSERT)
#text.update()
time.sleep(0.1)
count=count+1
root = Tk()
root.protocol("WM_DELETE_WINDOW", exit)
text=Text(root, height=1)
text.pack()
thread.start_new_thread(CountTime,())
canvas = Canvas(root, width=400, height=300)
canvas.pack()
wall = PhotoImage(file='wall.gif')
canvas.create_image(0, 0, image=wall, anchor=NW)
stop=0
root.mainloop()










