2017-09-27 4 views
0

J'ai modifié le code de here:données en écriture au fichier en combinaison avec des requêtes asynchrones http

import asyncio 
import time 
from aiohttp import ClientPayloadError 
from aiohttp import ClientSession 

COUNTER = 1 

async def fetch(url, session): 

    async with session.get(url) as response: 
     delay = response.headers.get("DELAY") 
     date = response.headers.get("DATE") 
     global COUNTER 
     COUNTER +=1 
     print("{}. {}:{} with delay {}".format(str(COUNTER), date, response.url, delay)) 
     try: 
      return await response.text() 
     except ClientPayloadError: 
      print("ERROR: ".format(url)) 


async def bound_fetch(sem, url, session): 
    # Getter function with semaphore. 
    async with sem: 
     await fetch(url, session) 


async def run(): 
    urls = [build_url(id) for id in load_ids()] 
    tasks = [] 
    # create instance of Semaphore 
    sem = asyncio.Semaphore(1000) 

    # Create client session that will ensure we dont open new connection 
    # per each request. 
    async with ClientSession(conn_timeout=10000, read_timeout=10000) as session: 
     for url in urls: 
      #pass Semaphore and session to every GET request 
      task = asyncio.ensure_future(bound_fetch(sem, url, session)) 
      tasks.append(task) 

     responses = asyncio.gather(*tasks) 
     await responses 

def build_url(id): 
    url = 'http://api.metagenomics.anl.gov/annotation/sequence/{}?source=Refseq'.format(id) 
    return url 

def load_ids(): 
    #in the "real" code I will load a file here and extract the ids 
    return """ 
    mgm4558908.3 
    mgm4484962.3 
    mgm4734169.3 
    mgm4558911.3 
    mgm4484983.3 
    mgm4558918.3 
    """.strip().split() 


start = time.clock() 
loop = asyncio.get_event_loop() 
future = asyncio.ensure_future(run()) 
loop.run_until_complete(future) 
run_time = (start - time.clock())/60 
print("this took: {} minutes".format(run_time)) 

Je sais que je peux imprimer les données de réponse à l'aide: print(await response.text()) Cependant, je ne suis pas dans les codes asynchrones et donc Je ne peux pas comprendre comment et où je devrais ouvrir un fichier et écrire dessus. Parce que je suppose qu'il y a une sorte de thread qui pourrait causer des problèmes en écrivant dans le même fichier en même temps (je suis familier avec le multitraitement).

Répondre

1

async ne multitraitement ou filetage Dans votre cas, vous pouvez essayer smt comme ceci:

with open(file, "w"): 
    async for s in run(): 
     f.write(s) 

, vous pouvez également essayer d'utiliser aiofiles ou curio pour le fichier AI/O

+0

Voulez-vous dire remplacer cette ligne: asyncio.ensure_future (run()) pour as dans asyncio.ensure_future (run())? – CodeNoob

+0

Je veux utiliser ce code à la place 'asyncio.ensure_future (run())' – AndMar

+0

Aah je comprends! Maintenant, j'écris les réponses à un fichier, quel code puis-je supprimer maintenant pour éviter qu'il enregistre tout en RAM? C'était le point entier pour moi de l'écrire dans un fichier;) – CodeNoob