2016-11-06 18 views
0

非ブロック型のTCPソケットを使用するpythonスクリプト(3.5.2)を作成しようとしています。ソケットは、アプリケーションからデータを受け取り、何らかの変換を行い、そのアプリケーションに送信します。変換には時間がかかるため、非同期にする必要があります。さらに、私のアプリケーションは同じポートでデータを送受信することができません。だから私の考えは、私のアプリケーションからポート4711(ちょっとした例)のデータを私のpythonスクリプトに送ってポート4712経由で結果を送り返すことです。TCPソケット - 異なるポートで送受信する

これまでのところ私はPythonやソケットではまったく動作しませんでした。私の質問は建築についてです。私は自分のスクリプトが4711(いくつかの異なるタスク)を介して常にデータを受信できるようにしたいと思っています。何かがあればそのデータを処理し、4712 - すべての非同期でデータを返します。だから私のアプリケーションは大きな作業負荷(いくつかのタスク)を送信することができ、結果が準備が整うとすぐに、それを1つずつ送り返すことができます。

私はソケットに関する現時点ではあまり圧倒されていません。受信と送信が自分自身や変換プロセスなどをブロックしないようにする方法はわかりません。誰かが説明や例を提供することができます?

+0

異なるポートを使用する必要があるのはなぜですか? TCPはあなたのために多重化を行います。あなたのPythonサーバーに接続する各クライアントは異なるソケットを与えます。その後、プロセスをforkして/スレッドを生成してリクエストを処理し、接続のためにソケットに応答を送り返すことができます。サーバーソケット上でいつでも新しい接続を受け入れることができます。あなたの側でソケットの理解が不足している、または私はあなたのためにこのデザインを不可能にする何かを逃していますか*異なるポートを使用する必要がありますか? –

+0

私は正しいと思います。私は知識が不足しています。 :)しかし、本当にこれの理由があります。私が使っているアプリケーション(私が開発したものではない第三者のアプリケーション)は、定義されたポートだけでデータを送信できました。聞く必要がある場合は、別のポートを選択する必要があります。同じポートにデータシンクとデータソースはありませんでした。 – Stefan

答えて

0

私の質問はアーキテクチャに関するものです。

1. asyncio

asyncio同時ネットワーク通信を使用してください。 uvloopでイベントループを実行します。

2.任意のMQソリューション

のRabbitMQ、ZeroMQなど、それらのいずれかを使用して、キューに新しいタスクを配置することができ、あなたが望むような計算を行うことなど、多くの労働者を実行します。

+0

私はすでにRabbitMQを見ましたが、実際には本当に良いオプションです。問題は、データを提供するアプリケーション(私が開発していないサードパーティのソリューション)がMQをまったくサポートしていないことです。唯一の良い解決策はtcpソケットのようです。 asyncioはtcpソケットで通信しますか?私はその話題に没頭しなければならないが、前提条件があればこれを使うことはできないと思う。 – Stefan

+0

@Stefanあなたが悲しんでいるように、「データを提供するアプリケーション」では、通常はソケット接続と応答を待ち受けるアプリケーションを作成する必要がありますが、asyncioは長時間実行されるタスクを処理できません。これはRabbitMQがジョブを処理キューにタスクを送信することによって処理します。一部のワーカーはそれを処理して出力キューに配置し、 'asyncio'を使用して出力キューをリッスンし、処理されたデータでクライアントに応答します。 – outoftime

+0

ああ、私は今それを得たと思います。アプリケーションはtcpソケットに接続し、データを転送します。このデータは、処理されるまでキューに保存されます。処理後、再びキューに送ることができます。次のスクリプトはこのキューを読み取り、tcpを介してアプリケーションに送信します。あなたはそれを意味しますか? OK、このTCPとキューの書き込み/読み取りのために少し複雑に思えますが、実際に私の問題を解決することができます。 – Stefan