問題タブ [python-asyncio]

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.

0 投票する
2 に答える
14248 参照

python - asyncio: Executor によって実行された Future をキャンセルすることは可能ですか?

asyncio 呼び出し loop.run_in_executor を使用して Executor でブロッキング関数を開始し、後でキャンセルしたいのですが、うまくいかないようです。

コードは次のとおりです。

上記のコードでは、ブロッキング関数の出力のみが許可されると予想されます。

次に、ノンブロッキング関数の出力を確認します。しかし、代わりに、キャンセルした後もブロッキングの未来が続きます。

出来ますか?それを行う他の方法はありますか?

ありがとう

編集: asyncio を使用したブロッキング コードと非ブロッキング コードの実行に関する詳細な説明: asyncio を使用してブロッキング コードと非ブロッキング コードをインターフェイスする方法

0 投票する
2 に答える
1694 参照

python - asyncio: yield from を使用せずにイベント ループの制御を解放することは可能ですか?

コルーチンデコレータとキーワードからの利回りを使用せずに、関数内で asyncio 制御ループを一定期間解放する方法があるかどうか疑問に思っていますか?

asyncio について何も知らないコードから do_something_periodically メソッドを呼び出すことができるように、これを実行できるようにしたいと考えていますが、スリープ中にループ制御を解放します。これは可能ですか?

ありがとう!

私の特定のユースケースのカットダウンバージョンを表示するように編集されました

0 投票する
1 に答える
3917 参照

python - Python 3 asyncio - 対 asyncio.async スタックの使用からの生成

Python 3 asyncio フレームワークを使用して、定期的な実行 (簡潔にするために実際のスリープ/遅延は省略) のさまざまなパターンを評価していますが、動作が異なる 2 つのコードがあり、その理由を説明できません。自分自身を再帰的に呼び出すために使用する最初のバージョンは、yield from予想どおり、約 1000 回の反復でスタックを使い果たしました。2 番目のバージョンは、コルーチンを再帰的に呼び出しますが、実際のイベント ループの実行を委譲asyncio.asyncし、スタックを使い果たしません。スタックが 2 番目のバージョンで使用されていない理由を詳しく説明できますか? このコルーチンを実行する 2 つの方法の違いは何ですか?

最初のバージョン (からの利回り):

2 番目のバージョン (asyncio.async):

0 投票する
1 に答える
1147 参照

python - Python で asyncio を使用して Web タスクを並列化する

私は asyncio と aiohttp に頭を悩ませようとしていますが、数年ぶりにプログラミングをすると、まったく愚かで無能だと感じます。変な禅の方法で、それは一種の美しいものです。しかし、残念ながら、やらなければならない仕事があります。

Web サイトへのサインアップ、データの取得、動作など、Web 上で多くの素晴らしいことを実行できる既存のクラスがあります。そして今、登録するには、これらの小さな働きバチが 100 から 1000 匹必要です。コードはおおよそ次のようになります。

ご覧のとおり、POST リクエストを行うために requests モジュールを使用しています。ただし、これはブロックしているため、ワーカー N+1 のサインアップを開始する前に、ワーカー N のサインアップが完了するまで待つ必要があります。幸いなことに、Worker クラスの元の作成者 (魅力的にマルクス主義者に聞こえます) は無限の知恵ですべての HTTP 呼び出しをself.make_requestメソッドでラップしたため、Worker 全体を非ブロッキングにすることは、要求ライブラリを非ブロッキングに交換するだけで済みます。 1 つ aaaaand ボブはあなたの叔父ですよね? これは私が得た距離です:

しかし、これはAttributeError: 'generator' object has no attribute 'get'signupが行うメソッドで を発生させますself.user_id = data.get("user_id")。それ以上に、私はまだきちんとした辞書に労働者を持っていません。asyncio の仕組みを完全に誤解している可能性が高いことは承知していますが、さまざまなドキュメント、David Beazly による驚異的なチュートリアル、およびそれらを理解するのに十分な大量のおもちゃの例を読んで、すでに 1 日を費やしました。この状況に適用するのは簡単です。ワーカーと非同期ループをどのように構成して、100 人のワーカーを並行してサインアップし、最終的にサインアップ後にすべてのワーカーのリストを取得する必要がありますか?

0 投票する
1 に答える
691 参照

python-3.x - asyncio ストリームは、リーダーにデータがあるかどうかを確認します

したがって、読み取りと書き込みが完全に非同期である単純な通信プロトコルを実装したいと考えています。つまり、クライアントが何らかのデータを送信すると、サーバーが応答する場合と応答しない場合があります。reader.read()したがって、少なくとも何かが返されるまでブロックされるため、単に呼び出すことはできません。そして、それまでの間に送信するものがもっとあるかもしれません。

では、読者が読むべきものを持っているかどうかを確認する方法はありますか? (特にストリーム バージョンについて話していることに注意してください。プロトコル バージョンには読み取りと書き込み用の個別のハンドラーがあり、この問題の影響を受けないことを十分に認識しています)

0 投票する
1 に答える
1450 参照

python-3.x - 永続的な接続を伴う asyncio

免責事項: これはおそらく非常に基本的な質問ですが、概念を理解していないため、目的を達成できません。

asyncio を使用して基本的なエコー クライアント サーバーを実装しようとしています。ドキュメントに含まれているサンプルから始めました。

私が達成したいのは、クライアントが即時接続以外のときにいつでもサーバーにデータを送信してから応答を読み取ることができる永続的な接続です(存在する場合)。接続は、明示的に閉じるまで両端で開いたままにする必要があります。

私はプロトコルのサンプルでこれをやっています。他の質問/ドキュメントを読むと、を使用してこれを実装できるようですがloop.call_later()、これは本当に良い解決策ですか? Queue理想的には、新しいパケットに即座に応答できるようにするためにa を使用したいと思います。

「MyProtocol. 初期化`:

しかし、これは何もしません。メインクライアントコードから新しいアイテムが挿入されると、すぐにメッセージが出力されると思います。何も起こりません...

さらにデバッグすると、キューがいっぱいになっていることが示されますが、out_queue.get() コルーチンは返されません。最初に、out_queue.put はアイテムを最初の .get() 呼び出しのウェイターにほとんど直接入れますが、まるでループが実行されていないかのようです。これは、クライアント接続全体に使用されるのと同じループです (すべてをスレッドに配置したため、新しいループを作成しました)。私が確認したところ、 .put() 呼び出しから行われた適切な呼び出しはすべてこのループ用です。

念のために言っておきますが、私は pip で asyncio install を使って Python 3.3 でこれを実行しています。

更新:これは、アイテムをキューに挿入しようとする方法です:

print決して実行されません。