gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 19:38:22 26 4
gpt4 key购买 nike

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

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

最佳答案

这有效。感谢我上面评论中的链接。

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()

关于python - SimpleXMLRPCServer、wxPython 和线程 - 如何停止?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2189069/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com