Python는 thread를 지원한다. C/C++과 Java처럼 함수 단위의 스레딩을 지원한다.
내 경우에는 기능을 완전히 분리하여 동작하기 때문에, Main thread와 별개로 특정 작업을 반복 수행한다. 더불어 각 스레드는 변수로 데이터를 공유하지 않고 DB를 이용한다.
# coding=utf-8
import sched
import threading
# 스케줄러 생성
readSchedule = sched.scheduler(time.time, time.sleep)
sendSchedule = sched.scheduler(time.time, time.sleep)
# 반복 처리 함수
def read():
data = do_read()
insert_data(data)
readSchedule.enter(time.time()+60, 0, read)
def send():
data = select_data()
do_send(data)
readSchedule.enter(time.time()+60, 0, send)
# 스레드 시작 함수
def read_thread():
# Add read schedule
readSchedule.enter(time.time()+5, 0, read)
readSchedule.run()
def send_thread():
# Add send schedule
sendSchedule.enter(time.time()+5, 0, send)
sendSchedule.run()
# 스레드 생성 함수
def makeThread(typeOfThread):
thread = None
if(typeOfThread == "read"):
thread = threading.Thread(target=read_thread)
thread.daemon = True
thread.start()
elif(typeOfThread == "send"):
thread = threading.Thread(target=send_thread)
thread.daemon = True
thread.start()
return thread
# 메인 스레드 동작
try :
threads = {
"read" : makeThread("read"),
"send" : makeThread("send")
}
while True:
for tot in threads:
if(not threads[tot].isAlive()):
threads[tot] = makeThread(tot)
time.sleep(5)
except Exception as e:
something_to_do()
finally :
finally_to_do()
코드는 아래와 같이 동작한다.
(1) 스레드 생성 : makeThread
(2) 스레드 시작 함수 동작 : read_thread / send_thread
(3) 스케줄러를 이용한 스레드별 동작 : read / send
메인 스레드는 5초 간격으로 자식 스레드들이 잘 살아있는지 확인한 다음, 죽었으면 다시금 시작시킨다. 또한 thread에 daemon = True로 하여, 부모 스레드가 죽으면 (프로그램 종료시) 자식 스레드들이 모두 죽도록 처리하였다.
마지막으로 scheduler.enter 함수는 (다음 실행 시간, 우선 순위, 함수)를 매개변수로 전달한다. 우선순위는 동일 시간에 여러개의 스케줄이 있을 때 우선순위가 높은(낮은 값) 것부터 실행한다.
위 코드는 스레드 생성 후 5초 뒤에 첫 작업을 수행하고, 그 다음 작업부터는 60초 간격으로 반복한다.
'프로그래밍 > C, C++, Java, Python' 카테고리의 다른 글
[Python] IEEE754 부동 소수점 <-> 비트 변환 예제 (0) | 2019.07.14 |
---|---|
[Python3] Python과 Node.js 사이의 JSON 통신 (0) | 2019.07.05 |
[데이터베이스] 그래프 데이터베이스 neo4j 설치 및 Java 연동 (0) | 2019.04.14 |
[C/C++] Simple Polygon의 Triangulation - OpenGL (0) | 2019.04.10 |
[C/C++] 간단하게 Visual Studio 2015에 C++ OpenGL 설치하기 (0) | 2019.04.10 |