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).
Voulez-vous dire remplacer cette ligne: asyncio.ensure_future (run()) pour as dans asyncio.ensure_future (run())? – CodeNoob
Je veux utiliser ce code à la place 'asyncio.ensure_future (run())' – AndMar
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