U E D R , A S I H C RSS

방울뱀스터디/Thread

Thread � 정�

쓰레드는 하나� 프로그램(프로세스)안�서 여러가지 �� �시� 처리해 주는 것� �합니다.
쉬운 예로 게임ì�„ 할때 ë°°ê²½ì�Œì•…ì�´ 나오면서ë�„ ìº�릭터가 움ì§�ì�´ê³  배경화면 ìœë ¥ë�¨. 즉 ì�¼ì�´ ë�™ì‹œì—� 처리ë�  때 ê°�ê°�ì�˜ ì�¼ë“¤ì�„ 쓰레드ë�¼ê³  합니다.~~!

참고)
프로세스(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� 리턴.

lock = thread.allocate_lock() #여기서 얻� lock는 모든 쓰레드가 공유해야 한다. (->전역)
# 쓰레드� 코드수행과정
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()


Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2021-02-07 05:29:35
Processing time 0.0044 sec