2012-03-06 12 views
3

Tornadoアプリケーションを開発するときに、私は頻繁にサーバーを再起動して、新しい変更を取得する必要があります。私はctrl-cを押してサーバを止めましたが、Tornadoでは非常に遅いようです。 ctrl-cが発行されると、シャットダウンするまで何秒も待つか、まったくシャットダウンしません。なぜ私はctrl-cを押すと竜巻が死ぬまでに時間がかかりますか?

ctrl-cをクリックした後、私はサーバーに新しい要求を(たとえば、サーバーを指しているブラウザを更新するなどして)行うと、すぐにシャットダウンします。

誰でもこの説明や修正方法を知っていますか?誰かが似たような経験をした?

(注、これはWindows上である。)

+0

これは単純なTornadoアプリケーションですか、通信用にデータベースコネクタや他のモジュールで使用していますか? ctrl-cとスレッドには興味深いやりとりがあるので、知っておくと便利です。 – koblas

+0

@koblas:私はウェブソケットを使用していますが、現在データベースはありません。 –

答えて

3
それは Ctrl+Cで終了するので、長い時間がかかる理由私にはわからないが、それは Ctrl+\(Linuxターミナル)を押して、いくつかのケースでは私のために働きました

Pythonでは、シグナルは常にメインスレッドによって処理されます。 IOLoopをメインスレッドから実行すると、サーバーがアイドル状態でIOを待っているときにIOLoopがブロックされます。その結果、すべての信号がスレッドで起床して起床します。つまり、要求を送信するとサーバーが停止する理由が説明されています。

UPDATE:あなたはループを開始するとき

ioloop = tornado.ioloop.IOLoop.instance() 
set_ping(ioloop, timedelta(seconds=2)) 
ioloop.start() 

def set_ping(ioloop, timeout): 
    ioloop.add_timeout(timeout, lambda: set_ping(ioloop, timeout)) 

、その後:あなたはこのような何かを試すことができます。その結果、selectが2.0秒のタイムアウトで呼び出され、ブロックされません。 (またIOLoop Timeouts参照)

(注:私はLinux上で自分の状況を再現することができませんでした、私は手動で使用することがselectを設定するので、私はこれが役立つことを100%の保証を与えることはできませんが、もっともらしく聞こえるにもかかわらず)

+0

ああ、それは面白いですし、意味があります。 IOを使わずにメインスレッドを定期的に起動させる方法があるのだろうか? 1秒おきに投票することができれば、それは私の問題を解決するでしょう。 –

+0

答えを更新しました。 – bereal

+0

恐ろしい!それは完全に機能します。 –

0

add_timeoutが動作します。

ili=tornado.ioloop.IOLoop.instance() 
tornado.ioloop.PeriodicCallback(lambda: None,500,ili).start() 
ili.start() 
関連する問題