티스토리 뷰
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 |
참조 : 빠르게 활용하는 파이썬3 프로그래밍
'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
- Private
- ManyToOne
- apache
- borderwidth
- Java
- 상수
- 리눅스
- tkinter command & bind [명령어묶기와 사건묶기] Python
- activebackground
- onetomany
- JPA
- highlightthickness
- FetchType
- activeforeground
- command
- disabledforeground
- Linux
- Python
- Composite Key
- 폼
- 파이썬
- tkinter
- indicatoron
- Module
- checkbutton
- highlightbackground
- Excel
- fetch join
- IdClass
- vba
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |