Je lisais récemment this document qui énumère un certain nombre de stratégies qui pourraient être employées pour implémenter un serveur socket. A savoir, ils sont:Écrire un serveur basé sur socket en Python, stratégies recommandées?
- Serve de nombreux clients chaque fil, et utiliser bloquante E/S et la notification de préparation déclenché par niveau
- Serve de nombreux clients chaque fil, et utiliser bloquante E/S et la préparation de notification de changement
- Serve de nombreux clients à chaque thread de serveur, et utiliser E/S asynchrones
- servir un client à chaque thread de serveur, et utiliser le blocage d'E/S
- Construire le code du serveur dans le noyau
Maintenant, j'apprécierais un indice sur lequel devrait être utilisé dans CPython, que nous savons a quelques bons points, et quelques mauvais points. Je suis surtout intéressé par les performances sous forte concurrence, et oui un certain nombre d'implémentations actuelles sont trop lentes. Donc, si je peux commencer par le plus facile, "5" est sorti, car je ne vais pas pirater quoi que ce soit dans le noyau.
"4" Apparemment, il doit être éteint à cause du GIL. Bien sûr, vous pourriez utiliser le multiprocessing à la place des threads ici, et cela donne un coup de pouce significatif. Bloquer les E/S a également l'avantage d'être plus facile à comprendre.
Et voici ma connaissance faiblit un peu:
« 1 » est traditionnelle select ou un sondage qui pourrait être trivialement combiné avec multitraitement.
« 2 » est la notification de changement de préparation, utilisé par le plus récent epoll et KQueue
« 3 » Je ne suis pas sûr qu'il ya des implémentations du noyau pour ce qui ont wrappers Python. Donc, en Python, nous avons un sac de bons outils comme Twisted. Peut-être sont-ils une meilleure approche, même si j'ai comparé Twisted et l'ai trouvé trop lent sur une machine à plusieurs processeurs. Peut-être avoir 4 torsades avec un équilibreur de charge pourrait le faire, je ne sais pas. Tout avis sera le bienvenu.
Je pense que epoll est dans le stdlib dans 2.6+, et easy_installable pour 2.5. Le paquet s'appelle select-something. Désolé pour le vague. –
Twisted peut également utiliser epoll. En fait, Twisted transforme toutes les API de notification d'événement prises en charge en une API uniforme qu'elle vous présente. Donc, si le meilleur que la plate-forme peut faire est de sélectionner, votre application utilise select. S'il a epoll, votre application utilise epoll. Tout est transparent pour vous. –
Il est orthographié 'asyncore' – new123456