python - Shadowsocks为什么不使用多线程来处理连接呢?
大家讲道理
大家讲道理 2017-04-18 09:26:46
0
3
429

最近在读 shadowsocks 的源码,有一些疑惑。 shadowsocks 每次通过 epoll 监听到新连接之后,程序都会阻塞一段时间去执行 on_remote_read() 或 on_remote_write() 来传输数据,数据传输完毕之后才会再次调用 epoll 并 accept 新的 socket 连接,当连接达到一定数量之后,会出现高延迟、低效率的情况啊

# 在知乎上问了这个问题,没人理只好来 SegmentFault 啦~

大家讲道理
大家讲道理

光阴似箭催人老,日月如移越少年。

全員に返信(3)
洪涛

このプロセスは、ハイディスク IO 操作ではなく、ハイ CPU およびハイメモリ操作であるため、つまり、このプロセスは CPU のパフォーマンスをテストします。そして、コンピューターには実際のマルチプロセスやマルチスレッドが存在せず、それらはすべて CPU スケジューリングを通じてシミュレートされることがわかっています。したがって、高い CPU を使用する操作の場合は、単一プロセスまたは単一スレッドの方法を使用するのが最適です (マルチコアの方が増加すると考えられます)。これは、前後の切り替えによる消費を回避できるため、最も効率的な方法です。スレッドまたはプロセス間。

これについては、Nginx のアーキテクチャを参照してください。Nginx の高負荷も単一プロセスで完了します。

いいねを押す +0
小葫芦

CPython のマルチスレッドは「実際の」マルチスレッドではありません (詳細については GIL を参照)。言語を変更しない場合、解決策は負荷分散 (haproxy など) を使用してマルチプロセスにすることです。フロント。

いいねを押す +0
PHPzhong

同時接続を処理するには複数のモデルがあります。マルチスレッドも一種であり、epollに代表されるノンブロッキングI/O+多重化も一種です。正しく使用されている限り、新しい接続が確立された後の読み取り/書き込みは、たとえ短時間であってもブロックされません。

初期のベテラン ドライバーは、さまざまな同時処理モデルを説明した Dan Kegel の The C10K 問題を読んだことがあります。あなたの英語がまあまあであれば、読んでみることをお勧めします。ああ、ところで、大規模な同時実行を処理するために実際のシステムで行われたさまざまな技術的拡張を含まない概念を学習している場合は、Richard Stevens の「Unix Network Programming」の方がより明確に説明されており、中国語訳も簡単に理解できます。読む。 。

いいねを押す +0
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート