<p>看起来你在试着制造/运行多个反应堆。所有的东西都与<em>相同的</em>反应堆相连。下面是如何使用<a href="http://twistedmatrix.com/documents/current/core/howto/defer.html#auto8" rel="noreferrer">^{<cd1>}</a>等待所有回调完成的方法。</p>
<p>还要注意,<code>twisAmaz</code>返回一个值。这个值通过<code>callbacks</code><code>DeferredList</code>传递,并以<code>value</code>的形式出现。由于<code>DeferredList</code>保持了放入其中的内容的顺序,因此可以将结果的索引与isbn的索引交叉引用。</p>
<pre><code>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()
</code></pre>