Erstellen eines Python-Programm warten, bis Verdrehte gibt einen Wert verschoben
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
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.