SimpleXMLRPCServer, wxPython и Thread - как остановить? - PullRequest
1 голос
/ 03 февраля 2010

Вот пример программы, которая иллюстрирует мою проблему.Программа запускает приложение 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

Ответы [ 2 ]

1 голос
/ 04 февраля 2010

Это работает. Кредит идет по ссылке в моем комментарии выше.

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 голосов
/ 29 июля 2015

Я не уверен, что он все еще интересен, но код работает, если

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

заменен на

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

Используя эти строки self.server.server_close ()вызовет ошибку в server_forever (), которая выйдет из него и завершит поток.

...