Upgrade to Pro — share decks privately, control downloads, hide ads and more …

A la découverte d' Asyncio

A la découverte d' Asyncio

Petite conférence dispensée lors de pytong 2014 pour donner envie de bricoler avec.

Avatar for Benoit Calvez

Benoit Calvez

September 20, 2014

More Decks by Benoit Calvez

Other Decks in Programming

Transcript

  1. Utiliser des sockets… client s = socket.socket() s.connect((‘host’, port)) data

    = s.recv() s.send(data) server s = socket.socket() s.bind(‘localhost’, port) s.listen(backlog) conn, addr = s.accept() conn.send(data) data = conn.recv()
  2. …Non bloquantes fcntl.fcntl(s, fcntl.F_SETFL, os.O_NONBLOCK) while True: try: data =

    s.recv(1024) except socket.error as e: err = e.args[0] if err == errno.EAGAIN or err == errno.EWOULDBLOCK: time.sleep(1) else: if not data: print("disconnected") break else: print("received data:", data)
  3. Avec un pool de thread Chaque connexion est déleguée à

    un thread —  Problème d’accès concurrents (locks)
  4. Evènementielles! En utilisant select/poll/epoll —  Réduit le coût d’une connexion

    (ram) —  CPU « bound » et non pas I/O « bound » Mais —  Code async (donc complexe) Et les IOCP sous windows, mais, c’est windows.
  5. Objets de base —  EventLoop: Boucle qui va executer des

    Task, appeler des callbacks —  Coroutine: « generator » dont l’execution peut-être suspendue —  Future: objet représentant un futur resultat (promise) —  Task: Objet qui tourne dans l’eventloop —  Protocol: Implementation du protocole sur le lien
  6. Exemple @asyncio.coroutine def myfunc(): yield from asyncio.sleep(2) loop = asyncio.get_event_loop()

    loop.run_until_complete(myfunc()) @coroutine def sleep(delay, result=None, *, loop=None): future = futures.Future() future._loop.call_later(delay, future.set_result, result) return (yield from future)
  7. Avec des sockets StreamReader data = yield from reader.read() StreamWriter

    writer.write(data) writer.writer(data) yield from writer.drain() reader, writer = asyncio.open_connection(host, port) Objets de plus haut niveau
  8. Les « Protocol » —  Implementation du protocole sur le

    lien —  Code partageable entre le serveur et le client —  Gestion des connexions et des deconnexions Note: Le serveur instanciera un protocol par client
  9. Exemple de protocole class SmtpClientProtocol(CommonSmtpProtocol): @asyncio.coroutine def helo(self, name): self.writer.write(b’HELO

    {}'.format(name)) yield from self.writer.drain() @asyncio.coroutine def vrfy(self, username): self.writer.writ(b'VRFY {}'.format(username)) yield from self.writer.drain()
  10. Pourquoi asyncio —  Programmation asynchrone explicite —  Beaucoup moins de

    callbacks —  Multiplexage de task (plus haut niveau) asyncio.wait() – asyncio.gather() —  Primitives de synchronisations (Events, Locks)