socketioの応用
3220 ワード
まず背景をはっきり言いましょう.
この2,3日、Web側にリアルタイムのデータ表示を行う必要があります.Web側のデータをwebsocketでリアルタイムに引き出すことです.
需要に合わせて検討したところ、socketioのほうが簡単だと思います.サービス側のデータは他のサイトから取り戻さなければならないので、相手はsocketioを使っています.これはサービス端がnodejsのようです.python版があるかどうか探しています.最後に以下のものをサービス端に使います.
この2,3日、Web側にリアルタイムのデータ表示を行う必要があります.Web側のデータをwebsocketでリアルタイムに引き出すことです.
需要に合わせて検討したところ、socketioのほうが簡単だと思います.サービス側のデータは他のサイトから取り戻さなければならないので、相手はsocketioを使っています.これはサービス端がnodejsのようです.python版があるかどうか探しています.最後に以下のものをサービス端に使います.
https://pypi.python.org/pypi/python-socketio/1.6.1
数据来源也用python来做客户端抓取吧。用这个:
https://pypi.python.org/pypi/socketIO-client
ツールの背景の紹介が終わったら、基本的な論理を話しましょう.
1.プログラムを書いて他のウェブサイトにデータをつかんで、手に入れてRedisメッセージキューに入れます.
2.私たちのウェブ側は自分のsocketioのサービス側に接続されています.
3.自分のサービス側がredisキューからデータを取得した後、すべてのウェブ側に直接ブロードキャストする.
キャプチャ側のコード:def on_message(*args): # dict TickHelper.handle(args) def on_connect(): logging.info("success connect server") def on_disconnect(): logging.info("disconnect from server") def on_reconnect(): logging.info("reconnect to server") def on_emit(*args): logging.info("success emit") def run(host,port): socketIO = SocketIO(host,port , headers={'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36'} ) socketIO.on('connect', on_connect) socketIO.on('disconnect', on_disconnect) socketIO.on('reconnect', on_reconnect) socketIO.emit('',on_emit)# 。 socketIO.on('message', on_message) #wait forever socketIO.wait()
socketioのイベントモデルはかっこいいですね.
次は前述のhandle関数の論理ですが、実は簡単で、redisを通じてキューに送ります.mgr = socketio.RedisManager('redis://xxx.xxx.xxx.xx:6379/0',write_only=True)# socketio , receive , write_only def handle(msg): mgr.emit("message", msg, room='tick')# room , group , room
これでデータをredisに入れました.
次はサービス端です.eventlet.monkey_patch()# , mgr = socketio.RedisManager('redis://xxx.xxx.xxx.xxx:6379/')# redis topickey, socketio。 write_only 。 sio = socketio.Server(async_handlers=True, logger=True,client_manager=mgr) # ,socketio , web 。 @sio.on('connect', namespace='/') def connect(sid, environ): sio.enter_room(sid=sid,room="tick")# logging.info("connect "+sid) @sio.on('tick_request', namespace='/') def message(sid): pass @sio.on('disconnect', namespace='/') def disconnect(sid): logging.info('disconnect '+sid) if __name__ == '__main__': init_logger() app = socketio.Middleware(sio) # deploy as an eventlet WSGI server eventlet.wsgi.server(eventlet.listen(('', 8000)), app)
覚えておいてください.eventletフレームワークは、python自身のthreadでは何も処理できません.さもないとコードがあなたのthreadにかかって、eventletは何も気にしません.