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

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

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

大家讲道理
大家讲道理

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

répondre à tous(3)
洪涛

Parce que ce processus est une opération nécessitant beaucoup de processeur et de mémoire, et non une opération d'E/S de disque élevée. En d'autres termes, ce processus teste les performances du processeur. Et nous savons que les ordinateurs ne disposent pas de véritables multi-processus ou multi-threads, ils sont tous simulés via la planification du processeur. Ainsi, pour les opérations gourmandes en CPU, il est préférable d'utiliser une méthode mono-processus ou mono-thread (le multicœur peut être considéré comme augmentant). C'est la méthode la plus efficace, car elle évite la consommation causée par les va-et-vient). entre les threads ou les processus.

Vous pouvez vous référer à l'architecture de Nginx pour cela. La charge élevée de Nginx s'effectue également en un seul processus.

小葫芦

Le multi-threading de CPython n'est pas un « vrai » multi-threading (voir GIL pour plus de détails, si vous ne changez pas de langage, la solution est de faire du multi-processus, avec un équilibrage de charge (haproxy et autres) dans. devant.

PHPzhong

Il existe plusieurs modèles pour gérer les connexions simultanées. Le multithreading est un type, et les E/S non bloquantes + multiplexage représentés par epoll sont également un type. Tant qu'il est utilisé correctement, la lecture/écriture après une nouvelle connexion ne bloquera pas, même pendant une courte période de temps.

Les conducteurs vétérans des premières années ont lu The C10K Problem de Dan Kegel, qui explique divers modèles de traitement simultané. Si votre anglais est passable, je vous recommande quand même de le lire. Oh, en passant, si vous apprenez des concepts qui n'impliquent pas diverses améliorations techniques apportées au système réel pour gérer une grande concurrence, alors la « programmation réseau Unix » de Richard Stevens l'explique plus clairement, et la traduction chinoise est également plus facile à comprendre. lire. .

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal