CherryPy Webサーバーを含む他のスレッドを起動した後にメインスレッドでreactor.run()
という反応装置を起動してTwistedを実行するアプリケーションを取得しました。CherryPyがWindowsのTwistedシャットダウンを妨げる
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()
私はここにシャットダウンをきれいにし、私はCherryPyにせずに書いた別のプログラムだからCherryPyには犯人は、ここにあると信じている。ここではCtrl + Cは、Windows上でLinux上ではなく、押されたときに正常にシャットダウンプログラムですCtrl + Cを押したときのLinuxとWindowsの両方:
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()
問題が何であるか分かりませんか? CherryPyには、私からreactor.callFromThread
を使用して通話何の機能も実行されていない場合はCherryPyには
reactor.callFromThread
を使用してシグナルハンドラから関数を呼び出すことができ、のLinuxのすべてで
- は、Windows上で
- に動作します:ここに私の難問ですシグナルハンドラが実行されます(シグナルハンドラ自体が呼び出されたことを確認しました)
私はこれについて何ができますか? CherryPyの実行中に信号ハンドラからWindows上でTwistedをシャットダウンする方法はありますか?これはバグですか?あるいは、この2つのプロジェクトのいずれかのドキュメントの重要な部分を見逃しただけですか?
ありがとうを!あなたの答えは非常によく書かれており、私はあなたに50の評判を与えるために恩恵を始めました。 –