SlideShare uma empresa Scribd logo
1 de 33
Baixar para ler offline
Asyncio: offrezdes tulipesà vosentrées- sorties asynchrones 
Thierry Chappuis
Qui? 
•Master en génie chimique et PhD en biotech à EPFL (Lausanne) •Professeur de génie chimique à la HES-SO (Fribourg) 
•Code en Python depuis 2000. 
•Stack python scientifique 
•Touche à tout, utilise python comme couteau suisse digital.
Quoi? (1/2) 
Dans la vraie vie, résoudre des problème à l'aide de e.g. Python implique de communiquer avec des sources extérieures: 
•base de donnée 
•socket 
•autre worker 
•service fournissant des données à travailler
Quoi? (2/2) 
CPU-Bound 
IO-Bound 
Parallélisme 
Async
Comment? 
•Twisted 
•gevent 
•Tornado 
•... 
•PEP-3148 → concurrent.futures (Python 3.2) 
•PEP-380 → yield from (Python 3.3) 
•PEP-3156 → Tulip → asyncio (Python 3.4)
Vers un nouveau standard ? (1/2) 
http://imgs.xkcd.com/comics/standards.png
Vers un nouveau standard? (2/2) 
"I'm not trying to reinvent the wheel. I'm trying to build a good one." 
Guido van Rossum
Pourquoi? (1/3) 
•ayncore et asynchat: included batteries don't fit 
–peu extensibles 
–personne ne les utilisent 
•Nouvelle syntaxe yield from pour les générateurs 
•Nouvelle implementation des IO asynchrones 
–Python >= 3.3 
–Trollius: backport pour Python 2.6
Pourquoi ? (2/3) 
•Conçu pour l'interopérabilité avec d'autres frameworks asynchrones 
→ Twisted est bien pour des protocoles ésotériques tandis que Tornado est excellent pour du http.
Pourquoi? (3/3) 
•Personne n'aime les fonctions de rappel 
→ Asyncio : Callbacks without callbacks
Les composants de asyncio? 
•Une boucle événementiellesubstituable avec des implémentations spécifiques à l'OS. 
•Abstractions pour les protocoles et les canaux de communication (transports), à la Twisted. 
•TCP, UDP, SSL, pipes, appels différés 
•Co-routines et tâches basées sur yield from (PEP-380) 
•Futures 
•Primitives de synchronisation imitant le module threading
Coroutines, Futures et Tâches? 
•Coroutine 
–Fonction génératrice 
–Décorée avec @coroutine 
•Future 
–Avance sur salaire (promesse d'un résultat ou d'une erreur) 
•Task 
–Future qui execute une coroutine
L'objet Future en bref 
Une promesse: f = Future() 
f.set_result() 
f.result() 
f.set_exception(e) 
e = f.exception() 
f.add_done_callback() 
f.remove_done_callback()
Future() et les coroutines 
•yield from peut renvoyer un Future 
–f = Future() 
•Quelqu'un va affecter un résultat ou une exception à f 
–r = yield from f 
•Attend que la tâche soit réalisée et retourne f.result()
Et les tâches? 
•Une tâche est une coroutine enveloppée dans un Future.
Quelle différence entre tâche et coroutine? 
•La coroutine ne s'exécute pas sans un mécanisme d'ordonnancement. 
•Une tâche avance "toute seule" 
→ La boucle événementielle joue le rôle de scheduler 
→ pour la magie: voir Victor Stinner
Exemples jouets de la doc asyncio 
1.Définition de la coroutine 
import asyncio 
@asyncio.coroutine 
def factorial(name, number): 
f = 1 
for i in range(2, number+1): 
yield from asyncio.sleep(1) 
f *= i
Exemplesjouetsde la doc asyncio 
2.Création des tâches et lancement de la boucle événementielle 
loop = asyncio.get_event_loop() 
tasks = [ 
asyncio.async(factorial("A", 2)), 
asyncio.async(factorial("B", 3)), 
asyncio.async(factorial("C", 4))] 
loop.run_until_complete(asyncio.wait(tasks)) 
loop.close()
Exemples jouets de la doc asyncio 
1.Définition de la coroutine 
import asyncio 
@asyncio.coroutine 
def tcp_echo_client(message, loop): 
r, w = yield fromasyncio.open_connection( 
'127.0.0.1', 8888) 
w.write(message.encode()) 
data = yield fromr.read(100) 
w.close()
Exemples jouets de la doc asyncio 
2.Création de la tâche et lancement de la boucle événementielle 
loop = asyncio.get_event_loop() 
loop.run_until_complete( 
tcp_echo_client('Hello', loop)) 
loop.close()
Exemples jouets de la doc asyncio 
1.Définition de la coroutine 
import asyncio 
@asyncio.coroutine 
def handle_echo(reader, writer): 
data = yield fromreader.read() 
writer.write(data 
yield from writer.drain() 
writer.close()
Exemples jouets de la doc asyncio 
2.Event loop 
loop = asyncio.get_event_loop() 
coro = asyncio.start_server(handle_echo, 
'127.0.0.1', 8888, loop=loop) 
server = loop.run_until_complete(coro) 
try: 
loop.run_forever() 
except KeyboardInterrupt: 
pass 
server.close() 
loop.run_until_complete(server.wait_closed()) 
loop.close()
Protocoles et transports à la Twisted 
import asyncio 
class EchoClientProtocol(asyncio.Protocol): 
def __init__(self, msg, loop): 
self.msg = msg 
self.loop = loop 
...
Protocoles et transports à la Twisted 
class EchoClientProtocol(asyncio.Protocol): 
... 
def connection_made(self, transport): 
transport.write(self.msg.encode()) 
print('Data sent') 
...
Protocoles et transports à la Twisted 
class EchoClientProtocol(asyncio.Protocol): 
... 
def data_received(self, data): 
print('Data received') 
...
Protocoleset transports à la Twisted 
class EchoClientProtocol(asyncio.Protocol): 
... 
def connection_lost(self, exc): 
print('The server left') 
print('Stop the event loop') 
self.loop.stop() 
...
Protocoles et transports à la Twisted 
... 
loop = asyncio.get_event_loop() 
msg = 'Hello' 
coro = loop.create_connection( 
lambda: EchoClientProtocol(msg, loop), 
'127.0.0.1', 8888) 
loop.run_until_complete(coro) 
loop.run_forever() 
loop.close()
Un exemple avec asyncio-redis 
import asyncio 
import asyncio_redis as aior 
@asyncio.coroutine 
def my_subscriber(channels): 
conn = yield fromaior.Connection.create( 
host='localhost', port= 6379) 
subscriber = yield from connection.start_subscribe() 
yield fromsubscriber.subscribe(channels) 
while True: 
reply = yield from subscriber.next_published() 
# do something with reply
Un exemple avec asyncio-redis 
... 
loop = asyncio.get_event_loop() 
asyncio.async(my_subscriber('channel-1')) 
asyncio.async(my_subscriber('channel-2')) 
loop.run_forever()
Un exempleavec asyncio-redis 
On peut écrire un PUB-SUB très similaire pour aiozmq pour ZeroMQ, qui utilise habituellement Tornado ou gevent pour l'asynchrone.
Projetset ressourcesasyncio 
•https://code.google.com/p/tulip/wiki/ThirdParty 
•http://asyncio.org
Conclusions 
Asyncio/Tulip est un projet jeune mais... 
•Présente un potentiel d'interopérabilité intéressant 
•Modèle élégant 
•La courbe d'apprentissage semble relativement aisée 
•Code asynchrone linéaire (facile à lire) 
•à suivre: la réponse à moyen terme des acteurs du domaines
Questions?

Mais conteúdo relacionado

Mais procurados

Tp2: Installation d'une couche d’abstraction entre un robot physique et ros
Tp2: Installation d'une couche d’abstraction entre un robot physique et rosTp2: Installation d'une couche d’abstraction entre un robot physique et ros
Tp2: Installation d'une couche d’abstraction entre un robot physique et rosSaid Benaissa
 
Javascript les générateurs (generators)
Javascript   les générateurs (generators)Javascript   les générateurs (generators)
Javascript les générateurs (generators)Julien CROUZET
 
Retours sur java 8 devoxx fr 2016
Retours sur java 8 devoxx fr 2016Retours sur java 8 devoxx fr 2016
Retours sur java 8 devoxx fr 2016Jean-Michel Doudoux
 
Développement informatique : Programmation fonctionnelle, décorateur et génér...
Développement informatique : Programmation fonctionnelle, décorateur et génér...Développement informatique : Programmation fonctionnelle, décorateur et génér...
Développement informatique : Programmation fonctionnelle, décorateur et génér...ECAM Brussels Engineering School
 
Cours python avancé
Cours python avancéCours python avancé
Cours python avancépierrepo
 
Java (8) eXperiments - DevoxxFR 2016
Java (8) eXperiments - DevoxxFR 2016Java (8) eXperiments - DevoxxFR 2016
Java (8) eXperiments - DevoxxFR 2016François Sarradin
 
Atoum, le framework de tests unitaires pour PHP 5.3 simple, moderne et intuit...
Atoum, le framework de tests unitaires pour PHP 5.3 simple, moderne et intuit...Atoum, le framework de tests unitaires pour PHP 5.3 simple, moderne et intuit...
Atoum, le framework de tests unitaires pour PHP 5.3 simple, moderne et intuit...fdussert
 
50 nouvelles choses que l'on peut faire avec Java 8
50 nouvelles choses que l'on peut faire avec Java 850 nouvelles choses que l'on peut faire avec Java 8
50 nouvelles choses que l'on peut faire avec Java 8José Paumard
 
Communications Réseaux et HTTP avec PHP
Communications Réseaux et HTTP avec PHPCommunications Réseaux et HTTP avec PHP
Communications Réseaux et HTTP avec PHPjulien pauli
 
ZendFramework2 - Présentation
ZendFramework2 - PrésentationZendFramework2 - Présentation
ZendFramework2 - Présentationjulien pauli
 
Presentation langage go_19022015
Presentation langage go_19022015Presentation langage go_19022015
Presentation langage go_19022015Stéphane Legrand
 
PHPTour 2011 - PHP5.4
PHPTour 2011 - PHP5.4PHPTour 2011 - PHP5.4
PHPTour 2011 - PHP5.4julien pauli
 
Pratique de la programmation en go
Pratique de la programmation en goPratique de la programmation en go
Pratique de la programmation en gokader15
 

Mais procurados (20)

Tp2: Installation d'une couche d’abstraction entre un robot physique et ros
Tp2: Installation d'une couche d’abstraction entre un robot physique et rosTp2: Installation d'une couche d’abstraction entre un robot physique et ros
Tp2: Installation d'une couche d’abstraction entre un robot physique et ros
 
Javascript les générateurs (generators)
Javascript   les générateurs (generators)Javascript   les générateurs (generators)
Javascript les générateurs (generators)
 
Formation python
Formation pythonFormation python
Formation python
 
Retours sur java 8 devoxx fr 2016
Retours sur java 8 devoxx fr 2016Retours sur java 8 devoxx fr 2016
Retours sur java 8 devoxx fr 2016
 
Développement informatique : Programmation fonctionnelle, décorateur et génér...
Développement informatique : Programmation fonctionnelle, décorateur et génér...Développement informatique : Programmation fonctionnelle, décorateur et génér...
Développement informatique : Programmation fonctionnelle, décorateur et génér...
 
Python profiling
Python profilingPython profiling
Python profiling
 
Cours python avancé
Cours python avancéCours python avancé
Cours python avancé
 
Google Developer Group (GDG) Aix-Marseille #1 (27/08/2018)
Google Developer Group (GDG) Aix-Marseille #1 (27/08/2018)Google Developer Group (GDG) Aix-Marseille #1 (27/08/2018)
Google Developer Group (GDG) Aix-Marseille #1 (27/08/2018)
 
Java (8) eXperiments - DevoxxFR 2016
Java (8) eXperiments - DevoxxFR 2016Java (8) eXperiments - DevoxxFR 2016
Java (8) eXperiments - DevoxxFR 2016
 
Atoum, le framework de tests unitaires pour PHP 5.3 simple, moderne et intuit...
Atoum, le framework de tests unitaires pour PHP 5.3 simple, moderne et intuit...Atoum, le framework de tests unitaires pour PHP 5.3 simple, moderne et intuit...
Atoum, le framework de tests unitaires pour PHP 5.3 simple, moderne et intuit...
 
50 nouvelles choses que l'on peut faire avec Java 8
50 nouvelles choses que l'on peut faire avec Java 850 nouvelles choses que l'on peut faire avec Java 8
50 nouvelles choses que l'on peut faire avec Java 8
 
Communications Réseaux et HTTP avec PHP
Communications Réseaux et HTTP avec PHPCommunications Réseaux et HTTP avec PHP
Communications Réseaux et HTTP avec PHP
 
ZendFramework2 - Présentation
ZendFramework2 - PrésentationZendFramework2 - Présentation
ZendFramework2 - Présentation
 
Python avancé : Lecture et écriture de fichiers
Python avancé : Lecture et écriture de fichiersPython avancé : Lecture et écriture de fichiers
Python avancé : Lecture et écriture de fichiers
 
Presentation langage go_19022015
Presentation langage go_19022015Presentation langage go_19022015
Presentation langage go_19022015
 
PHPTour 2011 - PHP5.4
PHPTour 2011 - PHP5.4PHPTour 2011 - PHP5.4
PHPTour 2011 - PHP5.4
 
Serveur http
Serveur httpServeur http
Serveur http
 
Programmation Fonctionnelle
Programmation FonctionnelleProgrammation Fonctionnelle
Programmation Fonctionnelle
 
Pratique de la programmation en go
Pratique de la programmation en goPratique de la programmation en go
Pratique de la programmation en go
 
Formation python 3
Formation python 3Formation python 3
Formation python 3
 

Destaque

Lengow : Retour d'expérience d'une start up développée à l'international
Lengow : Retour d'expérience d'une start up développée à l'international Lengow : Retour d'expérience d'une start up développée à l'international
Lengow : Retour d'expérience d'une start up développée à l'international osezleweb
 
Training Trainers for Health and Human Rights
Training Trainers for Health and Human RightsTraining Trainers for Health and Human Rights
Training Trainers for Health and Human RightsSaide OER Africa
 
D76 flux
D76 fluxD76 flux
D76 fluxkevi001
 
Hi-Media Couchbase meetup Paris Nb #1
Hi-Media Couchbase meetup Paris Nb #1Hi-Media Couchbase meetup Paris Nb #1
Hi-Media Couchbase meetup Paris Nb #1Mickaël Le Baillif
 
Utilisation de PostgreSQL chez Lengow
Utilisation de PostgreSQL chez LengowUtilisation de PostgreSQL chez Lengow
Utilisation de PostgreSQL chez LengowMickaël Le Baillif
 
A la queue leu leu
A la queue leu leuA la queue leu leu
A la queue leu leunautilebleu
 

Destaque (6)

Lengow : Retour d'expérience d'une start up développée à l'international
Lengow : Retour d'expérience d'une start up développée à l'international Lengow : Retour d'expérience d'une start up développée à l'international
Lengow : Retour d'expérience d'une start up développée à l'international
 
Training Trainers for Health and Human Rights
Training Trainers for Health and Human RightsTraining Trainers for Health and Human Rights
Training Trainers for Health and Human Rights
 
D76 flux
D76 fluxD76 flux
D76 flux
 
Hi-Media Couchbase meetup Paris Nb #1
Hi-Media Couchbase meetup Paris Nb #1Hi-Media Couchbase meetup Paris Nb #1
Hi-Media Couchbase meetup Paris Nb #1
 
Utilisation de PostgreSQL chez Lengow
Utilisation de PostgreSQL chez LengowUtilisation de PostgreSQL chez Lengow
Utilisation de PostgreSQL chez Lengow
 
A la queue leu leu
A la queue leu leuA la queue leu leu
A la queue leu leu
 

Semelhante a Asyncio: offrez des tulipes à vos entrées sorties asynchrones

Comment développer un serveur métier en python/C++
Comment développer un serveur métier en python/C++Comment développer un serveur métier en python/C++
Comment développer un serveur métier en python/C++cppfrug
 
16-Concurrence-APIs-Concurrentes.pdf
16-Concurrence-APIs-Concurrentes.pdf16-Concurrence-APIs-Concurrentes.pdf
16-Concurrence-APIs-Concurrentes.pdfPatiento Del Mar
 
17-Concurrence-Fork-Join.pdf
17-Concurrence-Fork-Join.pdf17-Concurrence-Fork-Join.pdf
17-Concurrence-Fork-Join.pdfPatiento Del Mar
 
Fork / Join, Parallel Arrays, Lambdas : la programmation parallèle (trop ?) f...
Fork / Join, Parallel Arrays, Lambdas : la programmation parallèle (trop ?) f...Fork / Join, Parallel Arrays, Lambdas : la programmation parallèle (trop ?) f...
Fork / Join, Parallel Arrays, Lambdas : la programmation parallèle (trop ?) f...Normandy JUG
 
11-Concurrence-Section critiques.pdf
11-Concurrence-Section critiques.pdf11-Concurrence-Section critiques.pdf
11-Concurrence-Section critiques.pdfPatiento Del Mar
 
Formation python
Formation pythonFormation python
Formation pythonj_lipaz
 
Introduction au lock-free programming avec std::atomics
Introduction au lock-free programming avec std::atomicsIntroduction au lock-free programming avec std::atomics
Introduction au lock-free programming avec std::atomicsAurélien Regat-Barrel
 
C# et .NET : Enigmes et puzzles
C# et .NET : Enigmes  et puzzlesC# et .NET : Enigmes  et puzzles
C# et .NET : Enigmes et puzzlesMicrosoft
 
02 Spécificité du C++ COURS SYS SYSSSSSS
02 Spécificité du C++  COURS SYS SYSSSSSS02 Spécificité du C++  COURS SYS SYSSSSSS
02 Spécificité du C++ COURS SYS SYSSSSSSAyoubElmrabet6
 
Présentation LMAX Disruptor So@t
Présentation LMAX Disruptor So@tPrésentation LMAX Disruptor So@t
Présentation LMAX Disruptor So@tFrancois Ostyn
 
Présentation LMAX / Disruptor
Présentation LMAX / DisruptorPrésentation LMAX / Disruptor
Présentation LMAX / DisruptorSOAT
 
retour sur confoo2011 et Symfony2
retour sur confoo2011 et Symfony2retour sur confoo2011 et Symfony2
retour sur confoo2011 et Symfony2Saad Tazi
 
Les nouveautés de C++11 : Ecrire du C++ Moderne
Les nouveautés de C++11 : Ecrire du C++ ModerneLes nouveautés de C++11 : Ecrire du C++ Moderne
Les nouveautés de C++11 : Ecrire du C++ ModerneMicrosoft
 

Semelhante a Asyncio: offrez des tulipes à vos entrées sorties asynchrones (20)

Cours de Génie Logiciel / ESIEA 2016-17
Cours de Génie Logiciel / ESIEA 2016-17Cours de Génie Logiciel / ESIEA 2016-17
Cours de Génie Logiciel / ESIEA 2016-17
 
Comment développer un serveur métier en python/C++
Comment développer un serveur métier en python/C++Comment développer un serveur métier en python/C++
Comment développer un serveur métier en python/C++
 
16-Concurrence-APIs-Concurrentes.pdf
16-Concurrence-APIs-Concurrentes.pdf16-Concurrence-APIs-Concurrentes.pdf
16-Concurrence-APIs-Concurrentes.pdf
 
17-Concurrence-Fork-Join.pdf
17-Concurrence-Fork-Join.pdf17-Concurrence-Fork-Join.pdf
17-Concurrence-Fork-Join.pdf
 
Fork / Join, Parallel Arrays, Lambdas : la programmation parallèle (trop ?) f...
Fork / Join, Parallel Arrays, Lambdas : la programmation parallèle (trop ?) f...Fork / Join, Parallel Arrays, Lambdas : la programmation parallèle (trop ?) f...
Fork / Join, Parallel Arrays, Lambdas : la programmation parallèle (trop ?) f...
 
Cours de Génie Logiciel / ESIEA 2013-2014
Cours de Génie Logiciel / ESIEA 2013-2014 Cours de Génie Logiciel / ESIEA 2013-2014
Cours de Génie Logiciel / ESIEA 2013-2014
 
11-Concurrence-Section critiques.pdf
11-Concurrence-Section critiques.pdf11-Concurrence-Section critiques.pdf
11-Concurrence-Section critiques.pdf
 
Formation python
Formation pythonFormation python
Formation python
 
Playing With PHP 5.3
Playing With PHP 5.3Playing With PHP 5.3
Playing With PHP 5.3
 
Chapitre 5 Linux
Chapitre 5 LinuxChapitre 5 Linux
Chapitre 5 Linux
 
Introduction au lock-free programming avec std::atomics
Introduction au lock-free programming avec std::atomicsIntroduction au lock-free programming avec std::atomics
Introduction au lock-free programming avec std::atomics
 
C# et .NET : Enigmes et puzzles
C# et .NET : Enigmes  et puzzlesC# et .NET : Enigmes  et puzzles
C# et .NET : Enigmes et puzzles
 
Python chapitre 4.pdf
Python chapitre 4.pdfPython chapitre 4.pdf
Python chapitre 4.pdf
 
Tp n 5 linux
Tp n 5 linuxTp n 5 linux
Tp n 5 linux
 
Part1
Part1Part1
Part1
 
02 Spécificité du C++ COURS SYS SYSSSSSS
02 Spécificité du C++  COURS SYS SYSSSSSS02 Spécificité du C++  COURS SYS SYSSSSSS
02 Spécificité du C++ COURS SYS SYSSSSSS
 
Présentation LMAX Disruptor So@t
Présentation LMAX Disruptor So@tPrésentation LMAX Disruptor So@t
Présentation LMAX Disruptor So@t
 
Présentation LMAX / Disruptor
Présentation LMAX / DisruptorPrésentation LMAX / Disruptor
Présentation LMAX / Disruptor
 
retour sur confoo2011 et Symfony2
retour sur confoo2011 et Symfony2retour sur confoo2011 et Symfony2
retour sur confoo2011 et Symfony2
 
Les nouveautés de C++11 : Ecrire du C++ Moderne
Les nouveautés de C++11 : Ecrire du C++ ModerneLes nouveautés de C++11 : Ecrire du C++ Moderne
Les nouveautés de C++11 : Ecrire du C++ Moderne
 

Asyncio: offrez des tulipes à vos entrées sorties asynchrones

  • 1. Asyncio: offrezdes tulipesà vosentrées- sorties asynchrones Thierry Chappuis
  • 2. Qui? •Master en génie chimique et PhD en biotech à EPFL (Lausanne) •Professeur de génie chimique à la HES-SO (Fribourg) •Code en Python depuis 2000. •Stack python scientifique •Touche à tout, utilise python comme couteau suisse digital.
  • 3. Quoi? (1/2) Dans la vraie vie, résoudre des problème à l'aide de e.g. Python implique de communiquer avec des sources extérieures: •base de donnée •socket •autre worker •service fournissant des données à travailler
  • 4. Quoi? (2/2) CPU-Bound IO-Bound Parallélisme Async
  • 5. Comment? •Twisted •gevent •Tornado •... •PEP-3148 → concurrent.futures (Python 3.2) •PEP-380 → yield from (Python 3.3) •PEP-3156 → Tulip → asyncio (Python 3.4)
  • 6. Vers un nouveau standard ? (1/2) http://imgs.xkcd.com/comics/standards.png
  • 7. Vers un nouveau standard? (2/2) "I'm not trying to reinvent the wheel. I'm trying to build a good one." Guido van Rossum
  • 8. Pourquoi? (1/3) •ayncore et asynchat: included batteries don't fit –peu extensibles –personne ne les utilisent •Nouvelle syntaxe yield from pour les générateurs •Nouvelle implementation des IO asynchrones –Python >= 3.3 –Trollius: backport pour Python 2.6
  • 9. Pourquoi ? (2/3) •Conçu pour l'interopérabilité avec d'autres frameworks asynchrones → Twisted est bien pour des protocoles ésotériques tandis que Tornado est excellent pour du http.
  • 10. Pourquoi? (3/3) •Personne n'aime les fonctions de rappel → Asyncio : Callbacks without callbacks
  • 11. Les composants de asyncio? •Une boucle événementiellesubstituable avec des implémentations spécifiques à l'OS. •Abstractions pour les protocoles et les canaux de communication (transports), à la Twisted. •TCP, UDP, SSL, pipes, appels différés •Co-routines et tâches basées sur yield from (PEP-380) •Futures •Primitives de synchronisation imitant le module threading
  • 12. Coroutines, Futures et Tâches? •Coroutine –Fonction génératrice –Décorée avec @coroutine •Future –Avance sur salaire (promesse d'un résultat ou d'une erreur) •Task –Future qui execute une coroutine
  • 13. L'objet Future en bref Une promesse: f = Future() f.set_result() f.result() f.set_exception(e) e = f.exception() f.add_done_callback() f.remove_done_callback()
  • 14. Future() et les coroutines •yield from peut renvoyer un Future –f = Future() •Quelqu'un va affecter un résultat ou une exception à f –r = yield from f •Attend que la tâche soit réalisée et retourne f.result()
  • 15. Et les tâches? •Une tâche est une coroutine enveloppée dans un Future.
  • 16. Quelle différence entre tâche et coroutine? •La coroutine ne s'exécute pas sans un mécanisme d'ordonnancement. •Une tâche avance "toute seule" → La boucle événementielle joue le rôle de scheduler → pour la magie: voir Victor Stinner
  • 17. Exemples jouets de la doc asyncio 1.Définition de la coroutine import asyncio @asyncio.coroutine def factorial(name, number): f = 1 for i in range(2, number+1): yield from asyncio.sleep(1) f *= i
  • 18. Exemplesjouetsde la doc asyncio 2.Création des tâches et lancement de la boucle événementielle loop = asyncio.get_event_loop() tasks = [ asyncio.async(factorial("A", 2)), asyncio.async(factorial("B", 3)), asyncio.async(factorial("C", 4))] loop.run_until_complete(asyncio.wait(tasks)) loop.close()
  • 19. Exemples jouets de la doc asyncio 1.Définition de la coroutine import asyncio @asyncio.coroutine def tcp_echo_client(message, loop): r, w = yield fromasyncio.open_connection( '127.0.0.1', 8888) w.write(message.encode()) data = yield fromr.read(100) w.close()
  • 20. Exemples jouets de la doc asyncio 2.Création de la tâche et lancement de la boucle événementielle loop = asyncio.get_event_loop() loop.run_until_complete( tcp_echo_client('Hello', loop)) loop.close()
  • 21. Exemples jouets de la doc asyncio 1.Définition de la coroutine import asyncio @asyncio.coroutine def handle_echo(reader, writer): data = yield fromreader.read() writer.write(data yield from writer.drain() writer.close()
  • 22. Exemples jouets de la doc asyncio 2.Event loop loop = asyncio.get_event_loop() coro = asyncio.start_server(handle_echo, '127.0.0.1', 8888, loop=loop) server = loop.run_until_complete(coro) try: loop.run_forever() except KeyboardInterrupt: pass server.close() loop.run_until_complete(server.wait_closed()) loop.close()
  • 23. Protocoles et transports à la Twisted import asyncio class EchoClientProtocol(asyncio.Protocol): def __init__(self, msg, loop): self.msg = msg self.loop = loop ...
  • 24. Protocoles et transports à la Twisted class EchoClientProtocol(asyncio.Protocol): ... def connection_made(self, transport): transport.write(self.msg.encode()) print('Data sent') ...
  • 25. Protocoles et transports à la Twisted class EchoClientProtocol(asyncio.Protocol): ... def data_received(self, data): print('Data received') ...
  • 26. Protocoleset transports à la Twisted class EchoClientProtocol(asyncio.Protocol): ... def connection_lost(self, exc): print('The server left') print('Stop the event loop') self.loop.stop() ...
  • 27. Protocoles et transports à la Twisted ... loop = asyncio.get_event_loop() msg = 'Hello' coro = loop.create_connection( lambda: EchoClientProtocol(msg, loop), '127.0.0.1', 8888) loop.run_until_complete(coro) loop.run_forever() loop.close()
  • 28. Un exemple avec asyncio-redis import asyncio import asyncio_redis as aior @asyncio.coroutine def my_subscriber(channels): conn = yield fromaior.Connection.create( host='localhost', port= 6379) subscriber = yield from connection.start_subscribe() yield fromsubscriber.subscribe(channels) while True: reply = yield from subscriber.next_published() # do something with reply
  • 29. Un exemple avec asyncio-redis ... loop = asyncio.get_event_loop() asyncio.async(my_subscriber('channel-1')) asyncio.async(my_subscriber('channel-2')) loop.run_forever()
  • 30. Un exempleavec asyncio-redis On peut écrire un PUB-SUB très similaire pour aiozmq pour ZeroMQ, qui utilise habituellement Tornado ou gevent pour l'asynchrone.
  • 32. Conclusions Asyncio/Tulip est un projet jeune mais... •Présente un potentiel d'interopérabilité intéressant •Modèle élégant •La courbe d'apprentissage semble relativement aisée •Code asynchrone linéaire (facile à lire) •à suivre: la réponse à moyen terme des acteurs du domaines