Frage

Ich habe ein Programm, das ihnen Informationen von anderen Seiten und Parsen mit BeautifulSoup und verdrehte die getPage abruft. Später im Programm drucke ich Informationen, dass der latente Prozess erstellt. Derzeit ist mein Programm versucht, es vor dem unterschied gibt die Informationen zu drucken. Wie kann ich es warten?

def twisAmaz(contents): #This parses the page (amazon api xml file)
    stonesoup = BeautifulStoneSoup(contents)
    if stonesoup.find("mediumimage") == None:
       imageurl.append("/images/notfound.png")
    else:
      imageurl.append(stonesoup.find("mediumimage").url.contents[0])

    usedPdata = stonesoup.find("lowestusedprice")
    newPdata = stonesoup.find("lowestnewprice")
    titledata = stonesoup.find("title")
    reviewdata = stonesoup.find("editorialreview")

    if stonesoup.find("asin") != None:
        asin.append(stonesoup.find("asin").contents[0])
    else:
        asin.append("None")
    reactor.stop()


deferred = dict()
for tmpISBN in isbn:  #Go through ISBN numbers and get Amazon API information for each
    deferred[(tmpISBN)] = getPage(fetchInfo(tmpISBN))
    deferred[(tmpISBN)].addCallback(twisAmaz)
    reactor.run()

.....print info on each ISBN
War es hilfreich?

Lösung

Was es scheint, wie ist Sie versuchen, mehrere Reaktoren zu machen / laufen. Alles wird mit dem gleichen Reaktor angebracht. Hier ist, wie zu verwenden, ein DeferredList für alle Ihre Rückrufe warten bis Ende.

Beachten Sie auch, dass twisAmaz einen Wert zurückgibt. Dieser Wert wird durch die callbacks DeferredList geleitet und kommt als value. Da ein DeferredList die Reihenfolge der Dinge hält, die in sie gesetzt sind, können Sie den Index der Ergebnisse mit dem Index Ihrer ISBN-Nummern Querverweis.

from twisted.internet import defer

def twisAmaz(contents):
    stonesoup = BeautifulStoneSoup(contents)
    ret = {}
    if stonesoup.find("mediumimage") is None:
        ret['imageurl'] = "/images/notfound.png"
    else:
        ret['imageurl'] = stonesoup.find("mediumimage").url.contents[0]
    ret['usedPdata'] = stonesoup.find("lowestusedprice")
    ret['newPdata'] = stonesoup.find("lowestnewprice")
    ret['titledata'] = stonesoup.find("title")
    ret['reviewdata'] = stonesoup.find("editorialreview")
    if stonesoup.find("asin") is not None:
        ret['asin'] = stonesoup.find("asin").contents[0]
    else:
        ret['asin'] = 'None'
    return ret

callbacks = []
for tmpISBN in isbn:  #Go through ISBN numbers and get Amazon API information for each
    callbacks.append(getPage(fetchInfo(tmpISBN)).addCallback(twisAmazon))

def printResult(result):
    for e, (success, value) in enumerate(result):
        print ('[%r]:' % isbn[e]),
        if success:
            print 'Success:', value
        else:
            print 'Failure:', value.getErrorMessage()

callbacks = defer.DeferredList(callbacks)
callbacks.addCallback(printResult)

reactor.run()

Andere Tipps

Eine andere kühle Art und Weise, dies zu tun ist mit @ defer.inlineCallbacks. Damit können Sie asynchronen Code wie eine normale sequentielle Funktion schreiben: http : //twistedmatrix.com/documents/8.1.0/api/twisted.internet.defer.html#inlineCallbacks

Als erstes sollten Sie keine reactor.stop setzen () in der latenten Verfahren, wie es alles tötet.

Nun, Verdreht, "Waiting" ist nicht erlaubt. So drucken Ergebnisse Sie Rückruf, fügen Sie einfach einen weiteren Rückruf nach dem ersten.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top