問題タブ [tornado-motor]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
asynchronous - 相互に依存する Tornado 非同期デコレーター
トルネードについて頭を悩ませようとしています。私はmongodbに裏打ちされたチャットアプリケーションを作成しており、motor
それへの非ブロックアクセスに使用しています。
私が達成しようとしているのは次のとおりです。
motor
mongo からユーザーのレコードを非同期にプルするために使用するデコレーターを作成します。- 資格情報を検証する (ユーザー名とトークン)
- 上記1.で取得したuser_idがチャットルームへのアクセスを許可されていることを確認する別のデコレーターを作成します。
motor
これには、「ChatRoom」レコードを取得するために、mongo への別の非同期呼び出しが必要です。 - 問題がなければチャットルームに登録する
デコレータ 1. が動作しています (基本的にhttp://tornadogists.org/5251927/から取得):
問題は、2 番目のデコレータの場合、 にアクセスする必要があることですself.current_user
。これは非同期コールバックで設定されるため、デコレーターに入ったときには使用できませんvalidation
(つまり、認証デコレーターが完了する前に検証デコレーターが呼び出されます)。
非同期関数でこのようにデコレータを使用することはできませんか? True であることを確認した後、上記のメソッド内で検証メソッドを呼び出すだけでよいself.current_user
ので、コールバックのようになりますか?
Handler のメソッドをこれらのデコレータの両方でラップして、別の場所で再利用できるようにしたいのが理想です。
更新
実際、依存関係はありません。user_id はパラメーターとして提供され、両方のデコレーターを並行して実行するために使用できます。1 つは認証を確認するため、もう 1 つはその ID を持つユーザーがルームへのアクセスを許可されているかどうかを確認するためです。open()
メソッドは、の場合にのみ続行されますself.auth_check == True and self.room_check == True
。
open()
ただし、非同期デコレータが完了する前に呼び出されることはありますか?
python - コレクションを追跡し、Tornado ですべての WebSocketHandlers を提供する 1 つのループを作成するにはどうすればよいですか?
次のコードは、単一のwhile True
ループを実行し、すべてのリスナーに同じデータを提供します。意図したとおりに機能しますが、醜いと思います。これを達成するためのより良い方法はありますか?
実際には、MongoDB oplog を追跡し、出力を解析して、関心のあるリスナーのみにサービスを提供します。その場合listeners
、たとえばキーが ObjectID であり、値が WebSocketHandlers の配列である dict になります。これは良いアイデアのように聞こえますか?
pymongo - python motor mongoカーソルの長さまたは次のピーク
モーターモンゴカーソルの長さを決定する方法や、次があるかどうかを確認する方法はありますか (fetch_next
おそらくではなくhas_next
)
cursor.size()
提供された limit() を考慮しないものではありません
基本的に必要なjsonコンマを追加したい
pymongo - python motor は集計時に fetch_next 例外を提供します
no fetch_next
Motor の集計関数で例外が発生して困っています
コードは
それは次のことを引き起こしました
例外: :'TracebackFuture' オブジェクトに属性 'fetch_next' がありません
次に、SOの質問で見つかった次のことを試しました
それは同じ例外を提供しました。
Mongo シェルで集計を実行すると、正真正銘の結果が得られます
Motor はfind
、`find_one でそのような問題を提供していません。実際、それ以外の場合は素晴らしく機能します。
インストールはpip install motor
Ubuntuで行いました。
乾杯
python - tornado コルーチン関数の変数はどうなりますか?
私はノンブロッキングIOの概念に不慣れで、コルーチンについて理解するのに苦労しています。このコードを検討してください:
get
関数が呼び出されると、 string が作成されますvar
。motor.insert
関数が の完了を待っているとき、この変数はどうなりますか? 私の理解では、「非ブロッキング」とは、IO 呼び出しが完了するのを待っているスレッドがなく、待機中にメモリが使用されていないことを意味します。var
では、格納されている値はどこにあるのでしょうか? 実行が再開されたときにどのようにアクセスできますか?
どんな助けでも大歓迎です!