python 에서 서브쓰레드를 정상종료해보자
시그널은 메인쓰레드만 받을수 있다.
메인쓰레드에서 시그널을 받아 서브쓰레드에 이벤트로 플래그를 전달한다.
#!/usr/local/python2.6/bin/python
#-*- coding: utf-8 -*-
import threading
import time
import logging
import random
import Queue
import signal
import sys
logging.basicConfig(level=logging.DEBUG,
format=
'(%(threadName)-9s) %(message)s'
,)
BUF_SIZE = 10
q = 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"
)
return
class
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.py
root 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 |