2016-08-08 42 views
3

Ich folgte diesem Tutorial: https://pawelmhm.github.io/asyncio/python/aiohttp/2016/04/22/asyncio-aiohttp.html und alles funktioniert gut, wenn ich wie 50 000 Anfragen mache. Aber ich brauche 1 milion API-Aufrufe zu tun, und dann habe ich Problem mit diesem Code:1 Million Anfragen mit aiohttp/asyncio machen - wörtlich

url = "http://some_url.com/?id={}" 
    tasks = set() 

    sem = asyncio.Semaphore(MAX_SIM_CONNS) 
    for i in range(1, LAST_ID + 1): 
     task = asyncio.ensure_future(bound_fetch(sem, url.format(i))) 
     tasks.add(task) 

    responses = asyncio.gather(*tasks) 
    return await responses 

Da Python benötigt 1 milion Aufgaben zu erstellen, ist es im Grunde nur nacheilt und druckt dann Killed Nachricht in Terminal. Gibt es eine Möglichkeit, einen Generator anstelle von vorgefertigten Set (oder Liste) von URLs zu verwenden? Vielen Dank.

+0

Ist nicht Semaphor dafür? Selbst wenn ich Semaphor auf 10 setze, bekomme ich Verzögerung und "Killed" Nachricht. –

+0

Ich habe das Beispiel aus dem Link versucht und es funktioniert. Wie der Autor sagte, etwa 11-12 Minuten für 1000000 Anfragen. Ich habe es sogar auf python3.4 eingestellt. Funktioniert hier. Vielleicht passiert etwas anderes mit Ihrem Code an einem anderen Ort. Kannst du den ganzen Code posten? – roman

+0

Können Sie die 'dmesg'-Befehlsausgabe nach dem Abbruch des Programms und/oder den vollständigen Fehler des Python-Interpreters posten. Es sollte ein MemoryError sein. – amirouche

Antwort

1

asyncio ist speichergebunden (wie jedes andere Programm). Sie können nicht mehr Aufgaben spawnen, die der Speicher halten kann. Meine Vermutung ist, dass Sie ein Speicherlimit erreicht haben. Überprüfen Sie dmesg für weitere Informationen.

1 Millionen RPS bedeutet nicht, dass es 1M Aufgaben gibt. Eine Aufgabe kann mehrere Anfragen in derselben Sekunde ausführen.