2010-02-03 15 views
1

下面是一個演示我的問題的示例程序。該程序啓動一個wxPython應用程序,並在一個線程中啓動一個SimpleXMLRPCServer。這一切工作正常。我的問題是我無法關閉SimpleXMLRPCServer線程,因爲它在handle_request()調用時被阻塞。我正在Windows XP機器上開發(我不知道在linux上是否出現同樣的問題)。SimpleXMLRPCServer,wxPython和線程 - 如何停止?

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 2010-02-03 02:38:16

回答

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 2012-03-10 22:22:50

0

我不知道它是否仍然感興趣,但代碼工作,如果

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

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

更換使用這些線self.server.server_close()將在server_forever()中引發一個錯誤,它將退出並完成該線程。