티스토리 뷰

Python

Python,module threading [멀티스레드]

hwangyoungjae 2016. 5. 19. 13:02
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

thread란 하나의 프로세스내에서 진행되는 하나의 실행단위를 뜻하며하나의 프로세스에서 여러 실행단위가 실행되는것을 멀티스레드라고 한다프로세스와 스레드는 모두 프로그램을 수행된다는 공통점을 가지고 있지만프로세스는 윈도우에서 여러 응용프로그램을 각각 실행시키는것처럼 독립적으로 실행되어 독립된 메모리공간을 사용하지만멀티스레드는 하나의 프로세스내에서 여러 스레드들이 프로세스공간의 메모리를 공유하여 사용할수 있다.

파이썬에서는 threading이라는 멀티스레드 기능을 지원하는 모듈을 제공한다.

threading모듈에서 자주 사용되는 객체를 살펴보고간단한 예제를 통해 threading모듈을 알아보자

 

>> 스레드 객체 <<

스레드를 사용하기 위해서는 일반적으로 threading.Thread를 상속받은 클래스객체를 생성하여 사용하며아래 나열된 메서드들을 주로 이용한다생성자를 재정의하는 경우 반드시 Thread.__init__()을 수행해야 한다.

 

>Thread.start()

스레드를 시작할때 사용함

 

>Thread.run()

스레드의 주요 동작을 정의함

 

>Thread.join([timeout])

스레드가 종료되기를 기다린다. timeout이 정의된경우최대 정의된 시간()만큼 기다린다.

 

>> Lock 객체 <<

하나의 프로세스에서 2개 이상의 스레드가 동시에 수행되는 경우스레드간에 프로세스 공간의 메모리를 공유한다만약 하나의 변수에 대해서 2개이상의 스레드가 변경을 가하고자 한다면어떤 스레드가 먼저 수행되느냐에 따라 결과가 달라질수 있다이러한 상태를 경쟁상태(race condition)라고 한다이러한 상황을 방지하기 위해서 파이썬에서는 Lock이라는 동기화 객체를 지원한다.

 

Lock객체는 locked unlocked 2가지 상태를 가지며, acquire() release()의 두가지 함수만을 제공한다.

unlocked상태에서 acquire()가 호출되면 locked상태로 바뀌고

locked상태에서 release()가 호출되면 unlocked상태로 바뀌게 된다.

locked상태에서 다른스레드가 acquire()를 호출하면 locked상태의 스레드가 release()할때까지 멈추게 된다.

 

 

>> threading모듈 예제 <<

아래 예제코드는 threading Thread Lock객체를 이용하여 각각 버그를 수정하는 시뮬레이션 프로그램이다.

전역변수로 총 버그개수를 정의해놓고생성된 3개의developer스레드가 각각 0.1초에 하나씩 버그를 해결해 나가게 된다.

버그개수가 0이 되어서 모든 스레드가 종료되면 각자 몇개씩 버그를 해결했는지 출력한다.

from threading import Thread, Lock

import time

 

count=10

lock=Lock()

 

class developer(Thread):

    def __init__(self,name):

        Thread.__init__(self)

        self.name=name

        self.fixed=0

 

    def run(self):

        global count

        while 1:

            lock.acquire()

            if count > 0:

                count -= 1

                lock.release()

                self.fixed += 1

                time.sleep(0.1)

            else:

                lock.release()

                break

 

dev_list=[]

for name in ['usr1','usr2','usr3']:

    dev=developer(name)

    dev_list.append(dev)

    dev.start()

 

for dev in dev_list:

    dev.join()

    print(dev.name, 'fixed',dev.fixed)

실행결과

usr1 fixed 4

usr2 fixed 3

usr3 fixed 3

위의 코드를 수행하면 매번 실행할때마다 결과가 달리지는것을 알수 있다.

 

-. 멀티스레드

import threading,time

 

def test1():

    time.sleep(5)

    print('5초지났다.')

 

def test2():

    for i in range(5):

        time.sleep(1)

        print("{0}second".format(i))

       

t1=threading.Thread(target=test1)

t2=threading.Thread(target=test2)

 

t1.start()

t2.start()

실행결과

0second

1second

2second

3second

5초지났다.

4second

 

참조 : 빠르게 활용하는 파이썬프로그래밍

 

'Python' 카테고리의 다른 글

Python,module weakref [약한참조]  (0) 2016.05.20
Python,module queue  (0) 2016.05.20
Python, 데이터베이스의 사용  (0) 2016.05.19
Python,module random [랜덤]  (0) 2016.05.19
Python,module decimal [십진법]  (0) 2016.05.19
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/07   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
글 보관함