python 에서 서브쓰레드를 정상종료해보자
시그널은 메인쓰레드만 받을수 있다.
메인쓰레드에서 시그널을 받아 서브쓰레드에 이벤트로 플래그를 전달한다.
#!/usr/local/python2.6/bin/python#-*- coding: utf-8 -*-import threadingimport timeimport loggingimport randomimport Queueimport signalimport syslogging.basicConfig(level=logging.DEBUG, format='(%(threadName)-9s) %(message)s',) BUF_SIZE = 10q = Queue.Queue(BUF_SIZE)e = threading.Event()class ProducerThread(threading.Thread): def __init__(self, group=None, target=None, name=None, args=(), kwargs=None, verbose=None): super(ProducerThread,self).__init__() self.target = target self.name = name def run(self): while not e.is_set(): if not q.full(): item = random.randint(1,10) q.put(item) logging.debug('Putting ' + str(item) + ' : ' + str(q.qsize()) + ' items in queue') logging.debug("end") returnclass ConsumerThread(threading.Thread): def __init__(self, group=None, target=None, name=None, args=(), kwargs=None, verbose=None): super(ConsumerThread,self).__init__() self.target = target self.name = name def run(self): while not e.is_set(): if not q.empty(): item = q.get() logging.debug('Getting ' + str(item) + ' : ' + str(q.qsize()) + ' items in queue') logging.debug("end") return if __name__ == '__main__': p = ProducerThread(name='producer') c = ConsumerThread(name='consumer') p.setDaemon(True) c.setDaemon(True) p.start() c.start() try: while p.is_alive() and c.is_alive(): time.sleep(1) except KeyboardInterrupt: e.set() p.join() c.join()kill 커맨드로 2번 시그널을 메인쓰레드에 전달한다.
end 구문까지 정상적으로 처리가 되고 종료가 된다.
]# ps -ef | grep tqt.pyroot 23927 13186 99 11:55 pts/0 00:00:10 /usr/local/python2.6/bin/python ./tqt.py ]# kill -2 23927 (producer ) Putting 1 : 1 items in queue(consumer ) Getting 1 : 0 items in queue(producer ) Putting 7 : 1 items in queue(consumer ) Getting 7 : 0 items in queue(producer ) Putting 5 : 1 items in queue(consumer ) Getting 5 : 0 items in queue(producer ) Putting 2 : 1 items in queue(consumer ) Getting 2 : 0 items in queue(producer ) Putting 1 : 1 items in queue(consumer ) Getting 1 : 0 items in queue(producer ) Putting 1 : 1 items in queue(consumer ) Getting 1 : 0 items in queue(producer ) Putting 2 : 1 items in queue(consumer ) Getting 2 : 0 items in queue(producer ) Putting 2 : 1 items in queue(consumer ) Getting 2 : 0 items in queue(producer ) Putting 2 : 1 items in queue(consumer ) Getting 2 : 0 items in queue(producer ) Putting 10 : 1 items in queue(consumer ) end(producer ) end'Python' 카테고리의 다른 글
| s3 example (0) | 2016.12.28 |
|---|---|
| daemonizing (0) | 2016.12.22 |
| pidlockfile.py for windows (0) | 2016.12.19 |
| cygwin + ssh + rsync (0) | 2016.12.10 |
| remove ^M(Carriage Return) (0) | 2016.11.30 |