Bienvenue sur IndexError.

Ici vous pouvez poser des questions sur Python et le Framework Django.

Mais aussi sur les technos front comme React, Angular, Typescript et Javascript en général.

Consultez la FAQ pour améliorer vos chances d'avoir des réponses à vos questions.

Passer du multithread à l'asynchrone : y a-t-il une méthode subprocess appliquée à l'asynchone ?

+2 votes

Je réalise quelques essais pour passer d'une logique multithread à une logique asynchrone.

Le code actuel :

import asyncio
import subprocess

q = asyncio.Queue(maxsize=0)

ips = ["10.59.6.1", "10.59.6.8", "10.59.6.9", "10.59.6.10"]

@asyncio.coroutine
def producer():
    while True:
        for ip in ips:  
            sub = subprocess.call("ping -c 1 %s" % ip,
            shell=True,
            stdout=open('/dev/null', 'w'),
            stderr=subprocess.STDOUT)
            yield from asyncio.sleep(1)
            if sub == 0:
                print("%s => est en vie" % ip)
                yield from q.put("%s => est en vie" % ip)
            else:
                print("%s => ne repond pas" % ip)
                yield from q.put("%s  => ne repond pas" % ip)

@asyncio.coroutine
def consumer():
    while True:
        elems = yield from q.get()
        print(elems)

asyncio.get_event_loop().run_until_complete(producer())
asyncio.get_event_loop().run_until_complete(consumer())
asyncio.get_event_loop().run_forever()

Je me demande si je procède correctement avec ce nouveau paradigme et s'il existe une méthode asynchrone pour faire un appel système ?

demandé 18-Jun-2015 par DoubleNain (1,718 points)
edité 19-Jun-2015 par DoubleNain

1 Réponse

+3 votes
 
Meilleure réponse

Je te conseil de jeter un coup d'oeil sur asyncio.createsubprocessexec

import asyncio
import shlex

q = asyncio.Queue(maxsize=0)
ips = ["10.59.6.1", "10.59.6.8", "10.59.6.9", "127.0.0.1"]

@asyncio.coroutine
def producer():
    while True:
        for ip in ips:
            ping_cmd = "ping -c 1 {}".format(ip)
            p = yield from asyncio.create_subprocess_exec(* shlex.split(ping_cmd),
                                                            stdout=open('/dev/null', 'w'),
                                                            stderr=asyncio.subprocess.STDOUT)

            _outs, _err = yield from p.communicate()
            if p.returncode:
                print("%s => ne repond pas" % ip)
                yield from q.put("%s => est en vie" % ip)-
            else:
                print("%s => est en vie" % ip)
                yield from q.put("%s => est en vie" % ip)



@asyncio.coroutine
def consumer():
    while True:
        elems = yield from q.get()
        print(elems)


loop = asyncio.get_event_loop()
loop.run_until_complete(producer())
loop.run_until_complete(consumer())
loop.run_forever()
répondu 18-Jun-2015 par akadi (324 points)
sélectionné 18-Jun-2015 par DoubleNain

Merci c'est plus beau et plus propre. J'ai regardé la doc async mais j'avoue ouvertement que c'est un peu bas niveau. J'ai encore un peu de lecture en prévision.

regarde cette présentation, elle est intéressante asyncio

Oui la vidéo de Victor est très intéressante. Néanmoins, je crois que je ne vais pas être attiré par ce style de programmation ; je trouve le code à base de callbacks difficile à lire et à comprendre. Je trouve que l'asynchrone est utilisé par les langages qui ne permettent pas d'utiliser nativement plusieurs coeurs du processeur pour pallier entre guillements leurs handicaps sur ce point.

Merci pour la vidéo, très instructive ! Je comprends désormais le mécanisme.

...