2014-09-01 2 views
3

이것은 파이썬에서 스레드를 사용한 첫 시도입니다. 다음 프로그램을 아주 간단한 예제로 작성했습니다. 목록을 가져 와서 일부 스레드를 사용하여 인쇄합니다. 그러나 오류가있을 때마다 프로그램이 우분투에서 멈 춥니 다. 다시 제어 프롬프트를 얻으려는 작업을 수행 할 수 없으므로 다른 SSH 세션을 다시 시작해야합니다. 내 프로그램에 문제가있다. 멈추지 않도록하기 위해 어떤 종류의 오류 처리가 있습니까? 당신의 노동자가 오류가 발생한으로하기 때문에 귀하의 질문이 걸려파이썬 스레드가 멈추거나 닫히지 않습니다.

from Queue import Queue 
from threading import Thread 
import HAInstances 
import logging 

log = logging.getLogger() 
logging.basicConfig() 

class GetHAInstances: 
    def oraHAInstanceData(self): 
     log.info('Getting HA instance routing data') 
     # HAData = SolrGetHAInstances.TalkToOracle.main() 
     HAData = HAInstances.main() 
     log.info('Query fetched ' + str(len(HAData)) + ' HA Instances to query') 
     # for row in HAData: 
     # print row 
     return(HAData) 

def do_stuff(q): 
    while True: 
    print q.get() 
    print threading.current_thread().name 
    q.task_done() 


oraHAInstances = GetHAInstances() 
mainHAData = oraHAInstances.oraHAInstanceData() 

q = Queue(maxsize=0) 
num_threads = 10 

for i in range(num_threads): 
    worker = Thread(target=do_stuff, args=(q,)) 
    worker.setDaemon(True) 
    worker.start() 

for row in mainHAData: 
    #print str(row[0]) + ':' + str(row[1]) + ':' + str(row[2]) + ':' + str(row[3])i 
    q.put((row[0],row[1],row[2],row[3])) 

q.join() 

답변

2

를 사용하여,이 "마지막으로 ... 제외 ... 시도"를 사용하는 것이 좋습니다. 이 구조는 오류가 발생하더라도 제어를 주 스레드로 반환합니다.

def do_stuff(q): 
    while True: 
     try: 
      #do your works 
     except: 
      #log the error 
     finally: 
      q.task_done() 

또한, 경우에 당신은, 당신의 프로그램을 죽일 이동 메인 스레드의 PID를 찾아서 죽일 kill #pid를 사용하고 싶습니다. Ubuntu 또는 Mint에서 ps -Ao pid,cmd을 사용하면 Python 스크립트를 실행하기 위해 입력 한 명령 (두 번째 열)을 검색하여 pid (첫 번째 열)를 찾을 수 있습니다.

0

또한, CTRL/C가 작동하지 않는 이유는 어떤 생각 (I 휴식 키가 없습니다). 따라서 q.task_done()이 호출되지 않습니다.

import threading 

스레드 방식에서

print threading.current_thread().name 
관련 문제