首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SimpleXMLRPCServer、wxPython和线程--如何停止?

SimpleXMLRPCServer、wxPython和线程--如何停止?
EN

Stack Overflow用户
提问于 2010-02-03 09:26:17
回答 2查看 2.1K关注 0票数 1

这是一个示例程序,说明了我的问题。该程序启动一个wxPython应用程序,并在线程中启动一个SimpleXMLRPCServer。这一切都运行得很好。我的问题是不能关闭SimpleXMLRPCServer线程,因为它在handle_request()调用中被阻塞了。我是在Windows XP机器上进行开发的(我不知道在linux上是否会出现同样的问题)。

代码语言:javascript
复制
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()

从我的在线研究中,我可以看到杀死线程是一个麻烦的问题。

似乎我的选择是扭曲的或处理模块..。有没有其他的解决方案?

这里有一篇我认为非常有趣的帖子,尽管我认为它不会对我有帮助,因为我可能在套接字而不是python中被阻塞:http://www.velocityreviews.com/forums/t330554-kill-a-thread-in-python.html

EN

回答 2

Stack Overflow用户

发布于 2010-02-04 11:25:21

这是可行的。功劳转到我上面评论中的链接。

代码语言:javascript
复制
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()
票数 1
EN

Stack Overflow用户

发布于 2015-07-29 05:07:20

我不确定它是否仍然令人感兴趣,但代码在以下情况下可以工作

代码语言:javascript
复制
while not self.timeToQuit.isSet():
    self.server.handle_request()

被替换为

代码语言:javascript
复制
try:
    self.server.serve_forever()
except:
    print( "SimpleXMLRPCServer stopped"  )

使用这些代码行,self.server.server_close()将在server_forever()中引发错误,退出并完成线程。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2189069

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档