質問

もうすることねじれを起動し炉 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を呼び出す問題があります)

あなたがブロック()の呼び出しを削除すると、あなたもクイックスタートの周りにスレッドを()は必要ありません。だから、あなたの行を置き換えます:

Thread(target=cherrypy.quickstart, args=[Root()]).start()

cherrypy.tree.mount(Root())
cherrypy.engine.start()
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top