server.pyはPython Web Frameworkであるtornadoを使っています。
client.htmlのプルダウンメニューから選択した銘柄をserver.pyに送り、対応する銘柄をSQLから取得し、client.htmlに送り返すプログラムを作りたい。
SQLが随時更新されるので、def on_messageを(*1)のようにwhile Trueを使って1銘柄のときは随時更新していました。
しかし、(*2)の注意書きを目にしたので、どうやってプルダウンメニューで別の銘柄を選んだ時に前のloopを切断し、新しい銘柄での随時更新情報をclient.htmlに送るのか、どなたか分かる方はいらっしゃいませんでしょうか?
それとも、他の良い方法があるのならばご教授いただければ幸いです。
(*1)
python:server.py
1import psycopg2, os, pandas as pd, time, json, random 2import tornado.websocket 3import tornado.ioloop 4 5class RealTimeDataHandler(tornado.websocket.WebSocketHandler): 6 def open(self): 7 print ('Session Opened. IP:' + self.request.remote_ip) 8 conn = psycopg2.connect( 9 dbname='postgres', 10 user='postgres', 11 password=os.environ.get('PostgreSQL_PASS'), 12 host='localhost', 13 ) 14 self.cur = conn.cursor() 15 16 self.ioloop = tornado.ioloop.IOLoop.instance() 17 18 def get_data_from_sql(self): 19 self.cur.execute("SELECT * FROM public.random_time_multi") 20 m = self.cur.fetchall() 21 column_names = [desc[0] for desc in self.cur.description] 22 data = pd.DataFrame(m, columns=column_names) 23 return data 24 25 def on_message(self, message): 26 column_name = json.loads(message)['symbol'] 27 while True: 28 data = self.get_data_from_sql() 29 message = json.dumps(data[column_name].to_dict()) 30 self.write_message(message) 31 time.sleep(5) 32 33 def on_close(self): 34 print("Session closed") 35 self.cur.close() 36 self.ioloop.stop() 37 38 def check_origin(self, origin): 39 return True 40 41def stop_tornado(): 42 tornado.ioloop.IOLoop.current().stop() 43 44app = tornado.web.Application([(r"/ws/display", RealTimeDataHandler)]) 45 46if __name__ == '__main__': 47 app.listen(8080) 48 try: 49 tornado.ioloop.IOLoop.current().start() 50 except: 51 print("KeyboardInterrupt received. Stopping Tornado.") 52 stop_tornado()
(*2)
on_messageメソッド内で無限ループ(while Trueなど)が実行されている場合、新しいメッセージを受け取ることができません。無限ループが実行されている間は、on_messageメソッドがブロックされてしまい、新しいメッセージを処理するためのイベントループが実行されないためです。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2023/04/24 08:01 編集