2010-02-03 51 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()中引发一个错误,它将退出并完成该线程。