Faire un programme en python attendre jusqu'à ce Tordu différés retourne une valeur
J'ai un programme qui extrait des informations à partir d'autres pages et de leur analyse à l'aide de BeautifulSoup et Tordu de getPage. Plus tard dans le programme, j'ai l'impression d'info que le différé processus crée. Actuellement mon programme tente de l'imprimer avant de le différaient renvoie l'info. Comment puis-je le faire attendre?
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
êtes-vous vraiment à l'aide de 1 espace pour l'indentation...
C'était un problème de mise en forme ici, le code utilise l'onglet
C'était un problème de mise en forme ici, le code utilise l'onglet
OriginalL'auteur Jody S | 2010-08-15
Vous devez vous connecter pour publier un commentaire.
Ce qu'il semble que vous essayez de faire/exécuter plusieurs réacteurs. Tout est attaché à la même réacteur. Voici comment utiliser un
DeferredList
attendre pour tous vos rappels à la fin.Également noter que
twisAmaz
renvoie une valeur. Cette valeur est passée à travers lescallbacks
DeferredList
et sortvalue
. Depuis unDeferredList
conserve l'ordre des choses qui sont mis en elle, vous pouvez la croix-référence de l'index des résultats avec l'index de votre code Isbn.OriginalL'auteur habnabit
Une autre façon cool de faire, c'est avec @reporter.inlineCallbacks. Il vous permet d'écrire du code asynchrone comme un fonctionnement séquentiel: http://twistedmatrix.com/documents/8.1.0/api/twisted.internet.defer.html#inlineCallbacks
OriginalL'auteur Thomas Dignan
Tout d'abord, vous ne devriez pas mettre un réacteur.stop() dans votre différé de méthode, il tue tout.
Maintenant, Tordus, "l'Attente" n'est pas autorisé. Imprimer les résultats de la vous de rappel, il suffit d'ajouter un autre rappel après la première.
Quand je dit de ne pas mettre un réacteur.stop(), je voulais pas la mettre dans cette première différés code, car il serait de tout arrêter. Si yo doit le mettre dans la dernière différés (celui qui imprimer les résultats) où vous êtes sûr que vous voulez arrêter votre programme. Juste une remarque: vous devez utiliser addCallbacks(method1,error_method) pour attraper les erreurs potentielles.
Regardez le tutoriel sur reportés sur twistedmatrix.com/documents/current/core/howto/..., en particulier la section nommée "Callbacks peuvent retourner deferreds'.
Ok, merci! Et le seul problème que j'ai maintenant c'est que je suis en accédant à plusieurs sites et d'essayer d'imprimer les données dans un ordre spécifique, donc, si j'ai une fonction pour chaque site, alors qu'il pourrait les imprimer de l'ordre...
OriginalL'auteur Luc Stepniewski