Où je veux en venir: je suis le principal auteur de trio. Je suis également l'un des principaux contributeurs à la curiosité (et a écrit l'article sur ce lien), et un Python de base dev qui a été fortement impliqué dans les discussions sur la façon d'améliorer asyncio.
Je ne suis pas sûr de ce que tu veux dire à propos des rappels. En trio (et la curiosité), l'un des principaux principes de conception est que vous n'avez jamais programme avec des rappels; il se sent plus comme basé sur le thread de programmation que le rappel de base de la programmation. Je suppose que si vous ouvrez le capot et de regarder comment ils sont mis en œuvre en interne, il y a des endroits où ils utilisent des rappels, ou des choses qui sont en quelque sorte l'équivalent de rappels si vous plissez les yeux. Mais c'est comme dire que Python et C sont équivalentes car l'interpréteur Python est mis en œuvre dans C. Vous n'utilisez jamais de rappels.
De toute façon:
Trio vs asyncio
Asyncio est plus mature
La première grande différence, c'est la maturité de l'écosystème. Au moment où j'écris ces lignes en Mars 2018, il y a beaucoup plus de bibliothèques avec asyncio de soutien que ce trio de soutien. Par exemple, pour l'instant, il n'y a pas de véritables serveurs HTTP avec le trio de soutien. Le Cadre :: AsyncIO classificateur sur PyPI a actuellement 122 bibliothèques, alors que le Cadre :: Trio de classificateur a seulement 8. J'espère que cette partie de la réponse ne deviennent obsolètes rapidement – par exemple, voici Kenneth Reitz à expérimenter avec l'ajout de trio de soutien dans la prochaine version de demandes mais en ce moment, vous devriez vous attendre si vous êtes en trio pour rien de compliqué, vous allez courir dans les pièces manquantes du puzzle que vous devez remplir vous-même au lieu de le saisir d'une bibliothèque de pypi, ou que vous aurez besoin d'utiliser le trio-asyncio forfait qui vous permet d'utiliser asyncio bibliothèques dans le trio de programmes. (Le trio canal de discussion est utile pour trouver ce qui est disponible, et ce que d'autres personnes travaillent sur.)
Trio rend votre code plus simple
En ce qui concerne les bibliothèques, ils sont aussi très différents. Le principal argument pour le trio, c'est qu'il fait de l'écriture de code concurrente beaucoup, beaucoup plus simple que d'utiliser asyncio. Bien sûr, quand était la dernière fois que vous avez entendu quelqu'un dire que leur bibliothèque rend les choses plus difficile à utiliser... laissez-moi vous donner un exemple concret. Dans cette présentation (diapositives), je prends l'exemple de la mise en œuvre de la RFC 8305 "Heureux globes oculaires", qui est une simple simultanées de l'algorithme utilisé pour établir efficacement une connexion réseau. C'est quelque chose qui Glyphe a été pensé depuis des années, et sa dernière version pour Torsadée est de ~600 lignes de long. (Asyncio serait à peu près le même; Tordu et asyncio sont très semblables du point de vue architectural.) Dans le discours, je vais vous apprendre tout ce que vous devez savoir pour mettre en œuvre dans <40 lignes à l'aide de trio (et nous avons corrigé un bug dans sa version pendant que nous y sommes). Ainsi, dans cet exemple, l'utilisation de trio rend littéralement notre code d'un ordre de grandeur plus simple.
Vous pouvez également trouver ces commentaires des utilisateurs d'intéressant: 1, 2, 3
Il ya beaucoup de différences dans le détail
Pourquoi est-ce arrivé? C'est beaucoup plus de réponse :-). Je suis peu à peu, sur la rédaction des différentes pièces dans les messages du blog et les discussions, et je vais essayer de me rappeler de mettre à jour cette réponse avec des liens à mesure qu'ils deviennent disponibles. Fondamentalement, c'est le Trio ayant un petit ensemble de soigneusement conçu primitives qui ont quelques différences fondamentales de toute autre bibliothèque que je connais (même si bien sûr construire sur les idées de beaucoup d'endroits). Voici quelques notes aléatoires pour vous donner une idée:
Un très, très répandue dans asyncio et bibliothèques est ce que vous appelez some_function()
, et il s'en retourne, si vous pensez que c'est fait – mais en fait elle est toujours en cours d'exécution en arrière-plan. Cela conduit à toutes sortes de difficile de bugs, car il est difficile de contrôler l'ordre dans lequel les choses se passent, ou de savoir où tout a fait terminé, et il peut être directement cacher des problèmes parce que si une tâche en arrière-plan se bloque avec une exception non gérée, asyncio généralement, il suffit d'imprimer quelque chose sur la console, puis continuez. En trio, la manière dont nous gérons la tâche de frai par l'intermédiaire de "pépinières" signifie qu'aucune de ces choses se produisent: lorsqu'une fonction retourne alors vous savez que c'est fait, et le Trio est actuellement le seul de la simultanéité de la bibliothèque pour Python, où des exceptions toujours se propager jusqu'à ce que vous les attraper.
Trio du mode de gestion des délais d'attente et les annulations est le roman, et je pense mieux que les précédents de l'état-of-the-art tels que les systèmes de C# et de Golang. Je n'avais vraiment écrire tout un essai sur ce, je ne vais pas entrer dans tous les détails ici. Mais asyncio annulation du système – ou vraiment, systèmes, il dispose de deux d'entre eux sont légèrement différentes sémantiques sont basés sur un ancien ensemble d'idées que C# et Golang, et est difficile à utiliser correctement. (Par exemple, il est facile pour le code accidentellement "s'échapper" d'une annulation par la ponte d'une tâche en arrière-plan; voir le paragraphe précédent.)
Il ya une tonne de la redondance des trucs dans asyncio, ce qui peut rendre difficile à dire une chose à utiliser lors de l'. Vous avez des contrats à terme, les tâches et les coroutines, qui sont essentiellement utilisés pour les mêmes fins, mais vous avez besoin de connaître les différences entre eux. Si vous souhaitez mettre en œuvre un protocole de réseau, vous devez choisir d'utiliser les protocoles/transports de la couche ou le flux de la couche, et ils ont tous deux délicate pièges (c'est ce que la première partie de l'essai que vous avez établi le lien est sur).
Le Trio est actuellement le seul de la simultanéité de la bibliothèque pour Python où control-C fonctionne comme vous le souhaitez (c'est à dire, il soulève KeyboardInterrupt
où jamais votre code). C'est une petite chose, mais ça fait une grosse différence :-). Pour diverses raisons, je ne pense pas que c'est réparable dans asyncio.
Résumé
Si vous avez besoin d'envoyer quelque chose de production la semaine prochaine, alors vous devriez utiliser asyncio (ou Tordu ou une Tornade ou gevent, qui sont encore plus mature). Ils ont de grands écosystèmes, d'autres personnes les ont utilisés dans la production avant vous, et ils ne vont pas n'importe où.
Si vous essayez d'utiliser ces cadres vous laisse frustrés et confus, ou si vous voulez expérimenter avec une façon différente de faire les choses, alors certainement vérifier trio – nous sommes à l'environnement :-).
Si vous voulez envoyer quelque chose à la production d'une année à partir de maintenant... alors je ne sais pas quoi vous dire. Python simultanéité est dans le flux. Le Trio a de nombreux avantages au niveau de la conception, mais est-ce suffisant pour surmonter asyncio la tête de démarrer? Va asyncio être dans la bibliothèque standard est un avantage ou un inconvénient? (Notez que ces jours tout le monde utilise requests
, même si la bibliothèque standard a urllib.) Combien de nouvelles idées dans le trio peut être ajouté à asyncio? Nul ne le sait. J'espère que il y aura beaucoup de discussions intéressantes sur ce à PyCon cette année :-).