2010-02-03 3 views
1

다음은 내 문제를 설명하는 예제 프로그램입니다. 이 프로그램은 wxPython 응용 프로그램을 시작하고 스레드에서 SimpleXMLRPCServer를 시작합니다. 이 모든 것이 잘 작동합니다. 내 문제는 그것이 handle_request() 호출에서 차단되기 때문에 SimpleXMLRPCServer 스레드를 종료 할 수 없다는 것입니다. Windows XP 컴퓨터에서 개발 중입니다 (Linux에서 동일한 문제가 발생하는지는 알 수 없습니다).SimpleXMLRPCServer, wxPython 및 Thread - Howto 중지 하시겠습니까?

import wx 
import SimpleXMLRPCServer 
import threading 

class myServerFunction(object): 
    def result(self): 
     return "Hello World" 

class serverThread(threading.Thread): 
    def __init__(self): 
     threading.Thread.__init__(self) 
     self.timeToQuit = threading.Event() 
     self.timeToQuit.clear()  

    def stop(self):  
     self.server.server_close() 
     self.timeToQuit.set() 

    def run(self): 
     self.server = SimpleXMLRPCServer.SimpleXMLRPCServer(("localhost", 8000), logRequests=False) 
     self.server.register_instance(myServerFunction) 
     #self.server.serve_forever() 
     while not self.timeToQuit.isSet(): 
      self.server.get_request() 
      self.server.handle_request() 

class MyFrame(wx.Frame): 

    def __init__(self, *args, **kwds): 
     wx.Frame.__init__(self, *args, **kwds) 
     self.serverThread = serverThread() 
     self.serverThread.start() 
     wx.EVT_CLOSE(self, self.OnExit) 

    def OnExit(self, event): 
     print "Server should turn off!" 
     self.serverThread.stop() 
     self.Destroy() 


app = wx.PySimpleApp(0) 
frame_1 = MyFrame(None, -1, "") 
app.SetTopWindow(frame_1) 
frame_1.Show() 
app.MainLoop() 
app.Exit() 

제 온라인 조사 결과, 스레드를 죽이는 것이 골칫거리 인 것을 알 수 있습니다.

내 옵션이 비틀어 지거나 모듈을 처리하는 것 같습니다. 다른 해결책이 있습니까? http://www.velocityreviews.com/forums/t330554-kill-a-thread-in-python.html

+0

나는이 대답을 전에 눈치 챘다. 나는 그것을 시도했는데, 효과가 없었기 때문에 뭔가 잘못했을 것임에 틀림 없다 - 나는 더 좋은 아이디어를 얻지 못하면 다시 시도 할 것이다. http://stackoverflow.com/questions/502610/running-simplexmlrpcserver-in-separate-thread-and-shutting-down/502956#502956 – mgag

답변

1

이 작동 :

여기에 내가 아마 파이썬에서 소켓에서 차단하고 있지 않다로 저를 도움이 될 것입니다 생각하지 않지만, 비정상적으로 재미라고 생각 하나 게시물입니다. 신용은 위의 코멘트에서 링크로 이동합니다.

import wx 
import SimpleXMLRPCServer 
import threading 
import xmlrpclib 

class myServerFunction(object): 
    def result(self): 
     print "myServerFunction" 
     return "Hello World" 

class serverThread(threading.Thread): 
    def __init__(self): 
     threading.Thread.__init__(self) 
     self.timeToQuit = threading.Event() 
     self.timeToQuit.clear()  

    def stop(self):  
     self.server.server_close() 
     self.timeToQuit.set() 

    def run(self): 
     print "runing" 
     self.server = SimpleXMLRPCServer.SimpleXMLRPCServer(("localhost", 8000), logRequests=False) 
     self.server.register_instance(myServerFunction()) 
     while not self.timeToQuit.isSet(): 
      self.server.handle_request() 

class MyFrame(wx.Frame): 

    def __init__(self, *args, **kwds): 
     wx.Frame.__init__(self, *args, **kwds) 
     self.serverThread = serverThread() 
     self.serverThread.start() 
     wx.EVT_CLOSE(self, self.OnExit) 
     self.server = xmlrpclib.Server("http://localhost:8000") 

    def OnExit(self, event): 
     print "Server should turn off!" 
     self.serverThread.stop() 
     print self.server.result() # dummy call to unlock the socket deadlock 
     self.Destroy() 

app = wx.PySimpleApp(0) 
frame_1 = MyFrame(None, -1, "") 
app.SetTopWindow(frame_1) 
frame_1.Show() 
app.MainLoop() 
app.Exit() 
+0

이 코드가 작동하지 않는 것 같습니다. – Adam

0

) (나는 여전히 관심이 있는지 잘 모르겠지만, 코드는

while not self.timeToQuit.isSet(): 
    self.server.handle_request() 

이 라인 self.server.server_close 사용

try: 
    self.server.serve_forever() 
except: 
    print("SimpleXMLRPCServer stopped" ) 

로 교체 할 경우 작동 server_forever()에 오류가 발생하여 종료하고 스레드를 종료합니다.

관련 문제