Se faciliter la vie quand on utilise asyncio dans le shell


Dernièrement j’ai mis les fonctions suivantes dans mon script PYTHONSTARTUP

Toujours choper une event loop toute fraiche, et ouverte:

import asyncio
 
def aloop(*args, **kargs):
    """ Ensure there is an opened event loop available and return it"""
    loop = asyncio.get_event_loop()
    if loop.is_closed():
        policy = asyncio.get_event_loop_policy()
        loop = policy.new_event_loop(*args, **kargs)
        policy.set_event_loop(loop)
    return loop

Lancer une coroutine dans une event loop jusqu’à ce qu’elle se termine:

import inspect
 
def arun(coro):
    """ Run this in a event loop """
    loop = aloop()
    if not inspect.isawaitable(coro):
        if not inspect.iscoroutinefunction(coro):
            coro = asyncio.coroutine(coro)
        coro = coro()
    future = asyncio.ensure_future(coro)
    return loop.run_until_complete(future)

Et ça s’utilise comme ça:

async def foo():
    await asyncio.sleep(1)
    print('bar')
 
arun(foo)

Ça me fait gagner pas mal de temps.

J’utilise aussi cette commande magique dans iPython qui permet de balancer des await en plein milieu du shell. Je suis en train de voir pour ajouter un truc similaire à ptpython.

Je me suis fait aussi un petit script pour lancer vite fait n’importe quel script dans une boucle asyncio de manière transparente, mais j’ai pas le temps de poster ça aujourd’hui donc ça sera pour la prochaine fois.

19 thoughts on “Se faciliter la vie quand on utilise asyncio dans le shell

  • batisteo

    Lapin compris.

    Mais c’est aussi parce que je n’ai pas fait/trouvé de tuto satisfaisant sur async, ni que j’ai toujours pas compris les (différences entre) coroutines, parallélisme, asynchrone, GIL, thread et subprocesses.

    Les réponses viendront Neo…

  • Zesk06

    J’ai vraiment l’impression que c’est bien asyncio, mais j’ai beau lire ce que je peux de tutoriels et d’explications, ça ne veut pas rentrer…

  • dmerej

    typo dans la doc string;

    “”” Ensure there is an open … “””

  • Atrament

    Dis, je suis un peu naïf, mais c’est pas arun(foo) en vrai la dernière ligne de code ?

  • Sam Post author

    @Zesk06, @batisteo : les tutos sur la question son vraiment, vraiment mauvais. Tous. Vraiment. Mais alors vraiment. C’est comme les tutos sur yield, ou les décorateurs. J’ai fini par écrire les miens car il n’y a rien de valable. Je vais devoir faire pareil pour asycio, mais c’est un boulot de fou donc je procastine.

    @Atrament, @dmerej : bien vu :)

  • Atrament

    @Sam : je suis super intéressé par ces tutos à venir ! j’ai beaucoup de mal à me mettre aux coroutines et à l’async justement à cause de ce manque de supports (et la doc standard ne fournit rien de rien de parlant). Pourtant ça a l’air vachement utile, ne serait-ce que pour ne pas figer la bécane sur du code lourd.

  • batisteo

    J’avoue que vos tutos pour les décorateurs c’était du travail de fou, et que, évidemment, ça en valait vraiment la peine. Vous êtes vraiment bon en didactique.

    Pour les tests aussi…

    Kudos <3

  • foxmask

    +1k pour les tuto à venir sur asyncio et ceux passés sur les décorateurs.

    Dommage que tu doives en passer par une vulgarisation de ces aspects pour “nous”, mais merci 1000 fois.

  • drezr

    Une bonne mise au claire sur asyncio serait vraiment géniale j’avoue, j’ai rien compris à l’article ;)

    C’est pas qu’il n’y ait aucune documentation sur le sujet, juste qu’il n’y en a aucune qui me motive à m’y mettre pour de bon.

    Trouve le courage Sam ! :>

  • boblinux

    @drezr +1, j’ai du mal à m’imaginer que l’article est rédigé en français…

  • bernardogui

    Le vocabulaire à l’air vachement hype autour de l’async ;)

  • bernadogui

    Même si j’apprécie votre site, je le consulte de moins en moins. Vous avez un très bon niveau technique, vous avez des qualités naturelles et indéniables en pédagogie. Cependant, votre niveau rédactionnel et orthographique est lamentable, voire fatigant, à la lecture.

    Je pense sincèrement que votre site ferait un bond qualitatif si les articles étaient correctement rédigés et cela renforcerait leur force pédagogique.

    Même si cela ne pose pas de problème aux jeunes générations largement analphabètes, ce n’est pas le cas de ma génération. Ce n’est pas du snobisme, mais j’éprouve parfois de réelles difficultés à vous lire.

    Néanmoins, je vous souhaite une bonne continuation et un bel avenir.

    Les tests unitaires sur vos fonctions grammaticales devraient être obligatoires. Votre craftman : le Besherelle.

  • Sam Post author

    Pas de problème, le jour où vous me paierez pour écrire ces articles, ils vous seront rendus sans faute.

    (ceci dit c’est marrant d’avoir ce comment sous cet article, c’est pas vraiment le pire que j’ai écris)

  • Grammar Nazi

    le Besherelle

    le Bescherelle

    Tous ces efforts pour se planter au dernier mot… La vie est injuste.

  • torrak

    @bernadogui –> Mwa cela me rassure o cauntraire d’avouir des gans qui eycrivent ossi mal qe mwa. sa pik les yoeux hein !?

    +1 pour un tuto sur asyncio

  • bernardogui

    @Sam

    Je veux bien payer. Ce n’est pas une attaque, c’est une remarque. Je viens quand même tous les jours sur votre site, car le cul est plus important pour moi que la programmation.

    @Grammar Nazi

    Merci pour la correction. Lorsqu’on veut l’ouvrir, il faut être irréprochable et tu as raison.

  • erdnaxeli

    Ça m’étonne tous ces commentaires sur asyncio, ça ne me parait pas être très compliqué. Justement, on peut écrire du code asynchrone qui ressemble beaucoup à du code synchrone, c’est je trouve un gros point positif d’asyncio. Après je n’ai jamais fait qu’utiliser des modules écrit avec asyncio, je n’ai jamais du utiliser ses primitives bas-niveau.

    Récemment j’ai utilisé des générateurs asynchrones (avec async for, aiter et anext), c’est bien stylé. Il ne manque plus qu’un petit « async yield [from] » pour éviter de devoir se taper tout une classe, et ce sera parfait.

Comments are closed.

Des questions Python sans rapport avec l'article ? Posez-les sur IndexError.