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.

asyncio découverte et incompréhensions

+1 vote

Je découvre asyncio (python 3.6 b) et j'ai l'impression de redécouvrir python. Je souhaite alimenter une file d'attente avec un lecteur de flux aiohttp. Chaque ligne lue pourrait être injectée dans la queue pour être ensuite traîté par un autre algo. Or ma file d'attente reste vide, et je ne comprend absolument pas pourquoi.

voici mon code :

import aiohttp
#import requests
from xml_parse_inject.exceptions_modules import *
from socket import gaierror
import asyncio, aiohttp
import xml.etree.cElementTree as ET
from contextlib import closing

async def connectStream(url, loop, queue):
    '''
    connect stream permet de lire un flux ligne par ligne et d'injecter les ligne dans une queue
    la queue sera traité par le balise reader
    :param url:
    :param loop:
    :return:
    '''
    try:
        async with aiohttp.ClientSession(loop=loop) as session:
            print('Session créée')
            async with session.get(url) as response:
                assert response.status == 200, "Il y a un problème pour joindre cette page"
                stream = response.content
                while not stream.at_eof():
                    line = await stream.readline()
                    print('nous ajoutons l\'item à la queue : \n {}'.format(line.decode()))
                    queue.put(str(line.decode()))
                    print('Le queue est de taille : {}'.format(queue.qsize()))
                queue.put(None)
    except (gaierror, aiohttp.errors.ClientOSError):
        print('Nous n\'arrivons pas à ouvrir la connexion vers l\'url : {}'.format(url) )


with closing(asyncio.get_event_loop()) as loop:
    queue = asyncio.Queue(loop=loop)
    loop.run_until_complete(asyncio.gather(connectStream('http://www.indexerror.net/', loop, queue)))

print("Nous fermons la loop")
demandé 6-Nov-2016 par torrak (160 points)

Du coup je me répond tout seul, grâce au tutoriel fait par Victor Stinner et Mike Müller disponible ici

dont je recommande la lecture.
il manquait tout simplement les await devant les queue.put...

Voici mon code modifié :

import aiohttp
from xml_parse_inject.exceptions_modules import *
from socket import gaierror
import asyncio, aiohttp
import xml.etree.cElementTree as ET
from contextlib import closing

async def connectStream(url, loop, queue):
    '''
    connect stream permet de lire un flux ligne par ligne et d'injecter les ligne dans une queue
    la queue sera traité par le balise reader
    :param url:
    :param loop:
    :return:
    '''
    try:
        async with aiohttp.ClientSession(loop=loop) as session:
            print('Session créée')
            async with session.get(url) as response:
                assert response.status == 200, "Il y a un problème pour joindre cette page"
                stream = response.content
                while not stream.at_eof():
                    line = await stream.readline()
                    print('nous ajoutons l\'item à la queue : \n {}'.format(line.decode()))
                    await queue.put(str(line.decode()))
                    print('Le queue est de taille : {}'.format(queue.qsize()))
                await queue.put(None)
    except (gaierror, aiohttp.errors.ClientOSError):
        print('Nous n\'arrivons pas à ouvrir la connexion vers l\'url : {}'.format(url) )


with closing(asyncio.get_event_loop()) as loop:
    queue = asyncio.Queue(loop=loop)
    loop.run_until_complete(asyncio.gather(connectStream('http://www.indexerror.net/', loop, queue)))

print("Nous fermons la loop")

Votre réponse

Preview

Votre nom à afficher ( en option ):
Vie privée: . Votre adresse de messagerie ne sera utilisée que pour l'envoi de ces notifications .
Vérification anti -spam:
Pour éviter cette vérification à l'avenir, Connectez vous ou inscrivez vous.
...