問題タブ [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 に答える
6454 参照

sockets - asyncio クライアントにソケット サーバーを呼び出して応答を待機させるにはどうすればよいですか

asyncio.Protocolクライアントがサーバーを呼び出すことを目的としたサーバーを使用していますが、サーバーが応答してデータが返されるまで待ってから、クライアントループを停止します。

asyncio doc Echo Client and Server に基づく: https://docs.python.org/3/library/asyncio-protocol.html#protocol-example-tcp-echo-server-and-client、transport.write の結果(...) は呼び出されるとすぐに返されます。

経験を通じて、呼び出しloop.run_until_complete(coroutine)は失敗しますRuntimeError: Event loop is running.

サーバーのメソッドで実行asyncio.sleep(n)data_received()ても効果はありません。

yield from asyncio.sleep(n)両方でサーバーyield from asyncio.async(asyncio.sleep(n))data_received()ハングします。

私の質問は、サーバーが応答を書き込むのを待ってから、制御を戻すにはどうすればよいですか?

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

python - Python: 同時 DNS 要求の実装 (パイプライン)

リクエストごとに異なるネームサーバーを使用して、複数の DNS リクエストを送信する python スクリプトを作成しようとしています。

シーケンシャル ソリューションの実装は dnspython を使用すると簡単ですが、私には遅すぎます。私の特定のケースでは、すべてのリクエストが同じソースポートを使用するため、スレッドプールを使用して同時実行を追加することはできません(REUSE_ADDRESSはここでも役に立ちません)。

上記の理由から、次の解決策を使用することを考えています (dnspython のリゾルバー モジュールの使用を捨てますが、メッセージ構築および解析モジュールを利用します)。

  • 最大 X 個のリクエストの進行を許可する
  • Xリクエストを同時に送信します(udpを使用してdnsリクエストパケットを送信するだけです。おそらくバーストを避けるために送信間に遅延を追加します)
  • 別のスレッドが応答を待ちます
  • 応答が到着したら、それを要求と (アドレスで) 照合し、新しい要求の実行を許可します
  • 要求への応答が TIMEOUT 秒以内に到着しない場合は、完了としてマークし、新しい要求の実行を許可します

ここでの私の主な問題は次のとおりです。

  • タスクタイムアウトを簡単に実装する方法
  • スレッド同期を使用せずに実装することは可能ですか (たとえば、イベント ループを使用しますか?)
  • それを実装するのに役立つ既存のライブラリはありますか? コア機能を柔軟に変更する必要があるため (生のソケットの使用、DNS ヘッダー フィールドの変更など)、既存の dns やネットワーク ライブラリを使用したくないことに注意してください。
0 投票する
1 に答える
10142 参照

python - asyncioでソケットを再接続するには?

app.py で asyncio を使用して 2 つのプロトコル (TcpClient と UdpServer) を作成したいと思います。ここで、TcpClient は server.py と UdpServer との永続的な接続を UDP サーバーとして提供します。

私が必要とするもの:
a)両方のプロトコルが通信すること:メソッドを互いに呼び出すこと。これは最初の接続でのみ機能しています。TcpClient が再接続した場合、「send to tcp」という文字列を再度送信することはできません。UdpServer から来ています。私はチェックしprint(self)て、TcpClientが新しいインスタンスを作成し、古いものはまだ存在しますが、接続していませんが、それをリファクタリングする方法がわかりません。私は asyncio を間違った方法で使用していると思います。
b) TcpClient が server.py から切断されたら、5 秒待ってから再接続を試みます。私はasyncioを使用しようとしましたcall_later()が、それを行うためのネイティブな方法があり、巧妙ではないと思います。
c) app.py を起動し、TcpClient が接続できない場合は、5 秒後に再接続を試みます。その方法がわかりません。

ここで私の例は app.py server.py のテストです。server.py はテスト用です。これは別の言語になります。

私が試したことを言うと:
1)app.pyを起動してserver.pyがダウンすると、app.pyは再試行しません。
2)app.pyがserver.pyに接続され、サーバーがダウンしてすぐにアップすると、TcpClientが再接続しますが、新しいインスタンスで他のメソッドを接続して文字列「send to tcp」を送信することはできません。server.py に接続します。これ以上の接続がない古いものだけです。
3)asyncio.async()代わりに使用するrun_until_complete()と、他のプロトコルからメソッドを呼び出すことができません。

app.py と server.py をここに置いたので、コピーして実行するだけでテストできます。

「send to tcp」という文字列を送信するために使用ncat localhost 9000 -u -vします。この文字列を UdpServer クラスに出力し、TcpClient クラスのメソッド send_data_to_tcp に渡す必要があります。このメソッドは文字列を server.py に送信します。<- これは、tcpClient の最初の再接続後は機能しません。

Python 3.4.0 を使用しています。

どうもありがとう。

app.py:

サーバー.py:

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

python - websocket + wamp: サーバー php とクライアント python、tcp 接続がドロップする

私は python3.3 クライアントで作業しています: ラチェットワンプ php サーバーに接続し、トピックにサブスクライブする必要があります。asyncio と autobahn をインストールしました。

この例https://github.com/tavendo/AutobahnPython/blob/master/examples/asyncio/wamp/beginner/client.pyに従いますが、ハンドシェイク後に tcp 接続が切断され、機能しません。

すべてのデバッグを有効にすると、結果は次のようになります。

サーバーは問題ありません (サーバーに接続されている別のアプリケーション)。なにか提案を?どうも!

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

python - この I/O バウンド操作で asyncio ライブラリがスレッドよりも遅いのはなぜですか?

サイトのドメイン名を列挙するために使用される Python プログラムを作成しています。たとえば、「a.google.com」です。

まず、threadingモジュールを使用してこれを行いました。

後で、場合によってはコルーチンがスレッドよりも高速であるという本を読みました。だから、私は使用するコードを書き直しましたasyncio

asyncioのバージョン getaddrinfoが非常に遅いのはなぜですか? どういうわけかコルーチンを誤用していますか?