2016-10-20 2 views
1

Je vais créer un serveur web qui pourrait recevoir beaucoup de connexions. Ces 10000 utilisateurs connectés enverront aux numéros de serveur et le serveur renverra ces nombres au carré aux utilisateurs en arrière. 10000 connexions sont trop nombreuses et une approche asynchrone est appropriée ici. J'ai trouvé deux bibliothèques pour Python 3.4 qui peuvent aider:Quelle bibliothèque Python devrais-je utiliser? SocketServer ou Asyncio?

SocketServer & asyncio

Avec SocketServer bibliothèque, nous pouvons utiliser des classes ThreadingMixIn et ForkingMixIn en tant que gestionnaires async. Mais ceci est limité par le nombre de cœurs. D'autre part, nous avons une bibliothèque asyncio. Et je ne comprends pas comment cela fonctionne exactement. Lequel dois-je utiliser? Et ces deux bibliothèques pourraient-elles travailler ensemble?

Répondre

5

Il existe différentes approches de la programmation asynchrone.

La première approche consiste à surveiller les opérations d'E/S à l'aide de threads et à gérer ces opérations de manière non bloquante. C'est ce que fait SocketServer.

La deuxième approche consiste à surveiller les opérations d'E/S dans le thread principal à l'aide d'une boucle d'événements et d'un selector. C'est généralement ce que les gens veulent dire lorsqu'ils parlent de programmation asynchrone, et c'est ce que font asyncio, twisted et gevent.

L'approche mono-thread présente deux avantages:

  • elle limite le risque de conditions de course depuis les callbacks sont en cours d'exécution dans le même thread
  • il se débarrasse de la surcharge de créer un thread par client (Voir le 10K problem)

Voici un exemple de asyncio TCP server (for python 3.5). Dans votre cas, il suffit de remplacer le handle_echo coroutine avec votre propre implémentation:

async def handle_client(reader, writer): 
    data = await reader.readline() 
    result = int(data.decode().strip()) ** 2 
    writer.write(str(result)).encode()) 
    writer.close() 

Il devrait facilement être en mesure de gérer des milliers de clients.