2016-03-26 13 views
1

たとえば、listener, err := net.Listen("tcp", ":8081")を使用してTCPポートでリッスンしていると仮定すると、listener.Accept()を別のゴルーチンで同時に呼び出すことはできますか?受付速度を最大限にするのに役立ちますか?listener.Accept()を同時に呼び出す

+3

正常に動作するはずですが、必要ありません。 'accept() 'の速度を最大にする方法は、接続を受け入れてスレッドを開始すること以外は何もしません。具体的には、I/Oを実行しないでください。これには、DNSルックアップが必要なものが含まれます。しかし、あなたがI/Oに対してこのルールを壊していない限り、 'accept()'スピードはサーバーパフォーマンスの重要な側面ではありません。 – EJP

+0

ありがとうございます。私はすでに同様のことをしています。受け入れられた接続をチャネルに送信し、いくつかのアクセプタ(コアの数)がそのチャネルを処理しています。そしてそれは良いことです。しかし、 'Accept()'のドキュメントは、同時に呼び出されるのが安全であれば何も言いません(そして、私はソースコードを見て、それは安全と思われますが、完全に理解できませんでした)。 –

答えて

4

net.Listenerは、フードの下にあるFileDescriptorです。 Accept()は、readLockで関数を保護してconnection-newFDを生成するPlan9機械を使用します。だからそれは安全に見えます。また、Lockは読み取り専用であり、排他的ではないので、あなたのスピードアップ呼び出しを同時に受け入れることができます。

+1

免責事項:私はGoの著者ではなく、ソースを調査するだけです。 – Uvelichitel

関連する問題