Ho un'applicazione che esegue Twisted avviando il reattore con reactor.run()
nella mia discussione principale dopo aver avviato alcuni altri thread, incluso il server Web CherryPy. Ecco un programma che si chiude in modo pulito quando viene premuto Ctrl + C su Linux, ma non su Windows:CherryPy interferisce con Arresto torto su Windows
from threading import Thread
from signal import signal, SIGINT
import cherrypy
from twisted.internet import reactor
from twisted.web.client import getPage
def stop(signum, frame):
cherrypy.engine.exit()
reactor.callFromThread(reactor.stop)
signal(SIGINT, stop)
class Root:
@cherrypy.expose
def index(self):
reactor.callFromThread(kickoff)
return "Hello World!"
cherrypy.server.socket_host = "0.0.0.0"
Thread(target=cherrypy.quickstart, args=[Root()]).start()
def print_page(html):
print(html)
def kickoff():
getPage("http://acpstats/account/login").addCallback(print_page)
reactor.run()
Credo che CherryPy è il colpevole qui, perché qui c'è un programma diverso che ho scritto senza CherryPy che fa l'arresto in modo pulito sia su Linux e Windows quando viene premuto Ctrl + C:
from time import sleep
from threading import Thread
from signal import signal, SIGINT
from twisted.internet import reactor
from twisted.web.client import getPage
keep_going = True
def stop(signum, frame):
global keep_going
keep_going = False
reactor.callFromThread(reactor.stop)
signal(SIGINT, stop)
def print_page(html):
print(html)
def kickoff():
getPage("http://acpstats/account/login").addCallback(print_page)
def periodic_downloader():
while keep_going:
reactor.callFromThread(kickoff)
sleep(5)
Thread(target=periodic_downloader).start()
reactor.run()
qualcuno ha idea di quale sia il problema? Ecco il mio dilemma:
- Su Linux tutto funziona
- Su Windows, posso chiamare funzioni da gestori di segnale utilizzando
reactor.callFromThread
quando CherryPy non è in esecuzione - Quando CherryPy è in esecuzione, nessuna funzione che ho chiamata utilizzando
reactor.callFromThread
da un gestore di segnale verrà mai eseguito (ho verificato che il gestore di segnale stesso viene chiamato)
Cosa posso fare a questo proposito? Come posso chiudere Twisted su Windows da un gestore di segnale durante l'esecuzione di CherryPy? È un bug o ho semplicemente dimenticato una parte importante della documentazione per uno di questi due progetti?
Grazie mille! La tua risposta è stata così ben scritta e utile che ho iniziato una taglia solo per darti 50 reputazione. –