問題タブ [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.
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()
ハングします。
私の質問は、サーバーが応答を書き込むのを待ってから、制御を戻すにはどうすればよいですか?
python - Python: 同時 DNS 要求の実装 (パイプライン)
リクエストごとに異なるネームサーバーを使用して、複数の DNS リクエストを送信する python スクリプトを作成しようとしています。
シーケンシャル ソリューションの実装は dnspython を使用すると簡単ですが、私には遅すぎます。私の特定のケースでは、すべてのリクエストが同じソースポートを使用するため、スレッドプールを使用して同時実行を追加することはできません(REUSE_ADDRESSはここでも役に立ちません)。
上記の理由から、次の解決策を使用することを考えています (dnspython のリゾルバー モジュールの使用を捨てますが、メッセージ構築および解析モジュールを利用します)。
- 最大 X 個のリクエストの進行を許可する
- Xリクエストを同時に送信します(udpを使用してdnsリクエストパケットを送信するだけです。おそらくバーストを避けるために送信間に遅延を追加します)
- 別のスレッドが応答を待ちます
- 応答が到着したら、それを要求と (アドレスで) 照合し、新しい要求の実行を許可します
- 要求への応答が TIMEOUT 秒以内に到着しない場合は、完了としてマークし、新しい要求の実行を許可します
ここでの私の主な問題は次のとおりです。
- タスクタイムアウトを簡単に実装する方法
- スレッド同期を使用せずに実装することは可能ですか (たとえば、イベント ループを使用しますか?)
- それを実装するのに役立つ既存のライブラリはありますか? コア機能を柔軟に変更する必要があるため (生のソケットの使用、DNS ヘッダー フィールドの変更など)、既存の dns やネットワーク ライブラリを使用したくないことに注意してください。
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:
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 接続が切断され、機能しません。
すべてのデバッグを有効にすると、結果は次のようになります。
サーバーは問題ありません (サーバーに接続されている別のアプリケーション)。なにか提案を?どうも!
python - この I/O バウンド操作で asyncio ライブラリがスレッドよりも遅いのはなぜですか?
サイトのドメイン名を列挙するために使用される Python プログラムを作成しています。たとえば、「a.google.com」です。
まず、threading
モジュールを使用してこれを行いました。
後で、場合によってはコルーチンがスレッドよりも高速であるという本を読みました。だから、私は使用するコードを書き直しましたasyncio
:
asyncio
のバージョン getaddrinfo
が非常に遅いのはなぜですか? どういうわけかコルーチンを誤用していますか?