3

rethinkdb .changes() 機能を使用して、いくつかのメッセージをユーザーにプッシュしたいと思います。メッセージは、ユーザーからの要求なしで送信する必要があります。

aiohttp と websockets で rethinkdb を使用しています。使い方:

  1. ユーザーがメッセージを送信
  2. サーバーはそれをrethinkdbに入れます
  3. 必要なもの: 追加のループでは rethinkdb.changes関数を使用して、接続されているユーザーに更新を送信します

これは私がアプリケーションを開始する方法です:

@asyncio.coroutine
def init(loop):
    app = Application(loop=loop)
    app['sockets'] = []
    app['susers'] = []
    app.router.add_route('GET', '/', wshandler)
    handler = app.make_handler()
    srv = yield from loop.create_server(handler, '127.0.0.1', 9080)
    print("Server started at http://127.0.0.1:9080")
    return app, srv, handler

にはwshandler、着信メッセージを処理するループがあります。

@asyncio.coroutine
def wshandler(request):
    resp = WebSocketResponse()
    if not resp.can_prepare(request):
        return Response(
            body=bytes(json.dumps({"error_code": 401}), 'utf-8'),
            content_type='application/json'
        )
    yield from resp.prepare(request)
    request.app['sockets'].append(resp)
    print('Someone connected')
    while True:
        msg = yield from resp.receive()
        if msg.tp == MsgType.text:
            runCommand(msg, resp, request)
        else:
            break
    request.app['sockets'].remove(resp)
    print('Someone disconnected.')
    return resp

開いている接続の同じプールにメッセージを送信する 2 番目のループを作成する方法は? スレッドセーフにする方法は?

4

1 に答える 1

3

一般的に言えば、イベント ループを実行するときは常にスレッドをできるだけ避けるようにしてください

残念ながら、すぐに使用できるrethinkdbサポートはありませんasyncioが、Tornado および Twistedフレームワークはサポートしています。したがって、Tornado &をブリッジasyncioして、スレッドを使用せずに機能させることができます。

編集

アンドリューが指摘したように、サポートrethinkdb はありませんasyncio2.1.0以降では、おそらく次のことができます。

rethinkdb.set_loop_type("asyncio")

次に、Web ハンドラーで次のようにします。

res = await rethinkdb.table(tbl).changes().run(connection)
while await res.fetch_next():
   ...
于 2015-11-23T20:54:59.320 に答える