2017-06-17 5 views
1

Ich habe ein Python-Skript, das asyncio verwendet, um über eine Million Anfragen zu machen. Ich habe zuerst Speicherprobleme und dann Semaphore entdeckt, seitdem habe ich erfolgreich einen Semaphor implementiert, um die Anzahl gleichzeitiger Aufgaben sowie Aufgaben in der Warteschlange auf einmal zu begrenzen.Löschen/zerstören fertige Futures asyncio Python

Mein Programm lädt eine Liste von Anforderungen wie folgt aus:

 with open(wordlist) as words: 
      w = words.read().splitlines() 

Dann diese Liste an die folgende Funktion für die Verarbeitung und die eigentliche Arbeit erledigt wird übergeben wird.

async def _process_dns_wordlist(self, wordlist, domain): 
    """Takes a list of words and adds them to the task list as space is available""" 
    for word in wordlist: 
     # Wait on the semaphore before adding more tasks 
     await self.sem.acquire() 
     host = '{}.{}'.format(word, domain) 
     task = asyncio.ensure_future(self._dns_lookup(host)) 
     task.add_done_callback(functools.partial(self._dns_result_callback, host)) 
     self.tasks.append(task) 
    await asyncio.gather(*self.tasks, return_exceptions=True) 

Bevor ich das Semaphore das Programm implementiert nur abstürzen würde, aus dem Speicher ausgeführt wird, wenn ich alle Aufgaben war Schlange stehen, jetzt läuft es eine Weile, und dann stürzt, weil es nicht genügend Arbeitsspeicher ca. 1/2 Weg läuft durch die Anfragen.

Ich gehe davon aus, dass dies liegt daran, dass nach der Zukunft von meinem Rückruf verarbeitet wird es dort in Speicherplatz verschwenden sitzt. Mein Problem ist, dass ich nicht herausfinden kann, was ich verwenden soll, um die verarbeitete Zukunft zu löschen, sobald ich damit fertig bin. Ich habe die Asynchron-Dokumente gelesen und sehe keine Methode zum Löschen/Löschen. Fehle ich etwas wirklich offensichtlich?

Danke für Ihre Hilfe!

Antwort

1

Es stellt sich heraus, dass die Antwort ziemlich einfach war, aber ich bin mir nicht sicher, ob dies der richtige Weg ist.

In meinem Rückruf, nachdem ich das Ergebnis fertig verarbeitete ich dies tat:

self.tasks.remove(future) 

Diese erfolgreich mein Speicherproblem gelöst. Wenn Sie eine bessere Lösung haben, lassen Sie es mich wissen!