我有一个程序,可以从其他页面获取信息,并使用BeautifulSoup和Twisted的getPage解析它们。稍后在程序中,我打印延迟进程创建的信息。目前我的程序试图在differed返回信息之前打印它。我怎么能让它等?
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
看起来你在试着制造/运行多个反应堆。所有的东西都与相同的反应堆相连。下面是如何使用^{} 等待所有回调完成的方法。
还要注意,
twisAmaz
返回一个值。这个值通过callbacks
DeferredList
传递,并以value
的形式出现。由于DeferredList
保持了放入其中的内容的顺序,因此可以将结果的索引与isbn的索引交叉引用。另一个很酷的方法是使用@defer.inlineCallbacks。它允许您像编写常规顺序函数一样编写异步代码:http://twistedmatrix.com/documents/8.1.0/api/twisted.internet.defer.html#inlineCallbacks
首先,不应该在延迟的方法中放置reactor.stop(),因为它会杀死所有东西。
现在,在Twisted中,“等待”是不允许的。要打印回调的结果,只需在第一个回调之后添加另一个回调。
相关问题 更多 >
编程相关推荐