2016-05-24 6 views
-4

ループを終了することなく値を無限ループに更新しようとしています。この値は、WebSocketクライアントからパラメータとして送信されます。私の質問は:どのように私は無限ループの内部にある値を更新できますか?ループ内の値を更新することは可能です

class WebSocketHandler(tornado.websocket.WebSocketHandler): 
    def open(self): 
     print('new connection') 
     clients.append(self) 
     self.write_message("connected") 
    def on_message(self, message): 
     print('tornado received from client: %s' % message) 
     new_message ="" 
     while True: 
      new_message=self.updateMessage(message) 
      print(new_message) 

    def updateMessage(self, message): 
     return(message) 

def main(): 
    parse_command_line() 
    app = tornado.web.Application(
     [ 
      (r"/ws", WebSocketHandler) 
     ], 
    template_path=os.path.join(os.path.dirname(__file__), "templates"), 
    static_path=os.path.join(os.path.dirname(__file__), "static") 
    ) 
    app.listen(options.port) 
    tornado.ioloop.IOLoop.current().start() 


if __name__ == "__main__": 
    main() 

私は、ループの内側に印刷されたメッセージは、ON_MESSAGE機能で受信した新しいメッセージ、で更新することにしたいです。 whileループを削除すると、新しいメッセージ(Websocketクライアントが送信した新しい値)が表示されます。しかし今では、ループのために最初のメッセージ(値)だけが永遠に印刷されます。

+0

私は基本的なpythonの質問のように聞こえるあなたの質問の本質をキャプチャする簡単な例にあなたのコードを蒸留することはいいと思う。これは一般的なことです(将来の読者にとって有益です)、WebSocketコードをたくさん解析する必要はありません。 – user20160

+1

インデントが壊れています。インデントは** Pythonで構文的に重要** **なので、修正するまではこれを議論するのは無駄です。 –

答えて

0

竜巻は、新しいメッセージを受信するたびにメッセージを聞き取り、 "on_message"を実行します。したがって、というメッセージが届くたびに無限ループを実行します。これはあなたが望むものではありません。

第2に、私はトルネードがデフォルトで単一のプロセスとスレッドを使用していると思いますので、無限ループでブロックするとそれ以上のメッセージは受信できません。

代わりに非同期コードを実行する必要があります。あなたは竜巻documentatioやドキュメントasyncio pythonで続きを読むことができますが、次のように動作するはずです:

class WebSocketHandler(tornado.websocket.WebSocketHandler): 

    newest_message = None 

    def open(self): 
     print('new connection') 
     clients.append(self) 
     self.write_message("connected") 

    def on_message(self, message): 
     print('tornado received from client: %s' % message) 
     self.newest_message = message 
     asyncio.ensure_future(show_newest_message()) 

    async def show_newest_message(self): 
     if self.newest_message is not None: 
      while True: 
       print(self.newest_message) 
       asyncio.sleep(1) 

私は竜巻とasyncioライブラリとその慣れていないよ、だから何を行うには良い方法があるかもしれませんあなたがしたい。

+0

残念ながら、動作していません...同じ値を印刷します。私が新しい価値を送るとき、それはループで変化しません。 –

+0

誤った結果を生成するコードを表示します。あなたの質問のコードでは何も変わりません。 – syntonym

+0

DEF ON_MESSAGE(自己、メッセージ): プリント( '竜巻は、クライアントから受信した:%s' は%メッセージ) new_message = "" 真つつ: new_message = self.updateMessage(メッセージ) プリント(new_message) DEFreturn(message) –

関連する問題