CherryPyの妨げにツイス停止Windows
質問
もうすることねじれを起動し炉 reactor.run()
私のメインスレッド開始後その他のスレッドを含むCherryPy webサーバです。このプログラムをシャットダウンするときの場合はCtrl+Cを押したLinuxな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()
ていると思いCherryPyが原因で、ここでこのプログラムを書いてくCherryPyる停止の両方を綺麗にLinuxやWindowsの場合は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()
はもう何が問題なのか?ここでの私の謎:
- Linuxべての動作
- Windowsできる電話機からの信号ハンドラを使用
reactor.callFromThread
時CherryPyラグインが表示されない - 時CherryPyで機能を呼びかけを使用
reactor.callFromThread
からの信号ハンドラが実行(確認できている信号のハンドラ自身がると呼ばれる)
どうすればいいのか。たいのですが停止ねじれたWindowsからの信号ハンドラを走りながらCherryPy?このバグは、いまだ訪れている重要な部分のドキュメンテーションにはこれらの二つのプロジェクト?
解決
CherryPyには、デフォルトでは信号を処理します。あなたのケースでは、あなたはおそらく唯一の数行でクイックスタートを、アンロール、および選んで選択する必要があります。ここでは基本的に何クイックスタートトランクでいます:
if config:
cherrypy.config.update(config)
tree.mount(root, script_name, config)
if hasattr(engine, "signal_handler"):
engine.signal_handler.subscribe()
if hasattr(engine, "console_control_handler"):
engine.console_control_handler.subscribe()
engine.start()
engine.block()
あなたがそれらを省略することができるようにあなたのケースでは、あなたは、シグナルハンドラを必要としません。また、あなたがメインスレッドからCherryPyはを開始していない場合engine.blockを呼び出す必要はありません。 Engine.block()は、メインスレッドがすぐに終了しないようにするだけの方法ですが、代わりにプロセス終了の周りを待つ(これはとても自動再を確実に動作され、いくつかのプラットフォームでは、任意のスレッドが、メインスレッドからEXECVを呼び出す問題があります)。 P>
あなたがブロック()の呼び出しを削除すると、あなたもクイックスタートの周りにスレッドを()は必要ありません。だから、あなたの行を置き換えます:
Thread(target=cherrypy.quickstart, args=[Root()]).start()
と
cherrypy.tree.mount(Root())
cherrypy.engine.start()