9
votes

Faire un programme Python Attendez que le différé tordu renvoie une valeur

J'ai un programme qui récupère des informations d'autres pages et les analysera à l'aide de la magnételle et de la getpage de Twisted. Plus tard dans le programme, je imprime des informations que le processus différé crée. Actuellement, mon programme essaie de l'imprimer avant que les informations varient différente. Comment puis-je le faire attendre? XXX


2 commentaires

Utilisez-vous vraiment 1 espace pour l'indentation ...


C'était un problème de formatage ici, le code actuel utilise l'onglet


3 Réponses :


2
votes

Tout d'abord, vous ne devriez pas mettre un réacteur.stop () dans votre méthode différée, car elle tue tout.

Maintenant, en tordu, "attendre" n'est pas autorisé. Pour imprimer les résultats de votre rappel, ajoutez simplement un autre rappel après le premier.


4 commentaires

Merci, Luc! Puis-je demander où le réacteur.stop () devrait aller?


Quand j'ai dit de ne pas mettre un réacteur.stop (), je voulais dire ne pas la mettre dans ce premier code différé, car cela empêcherait tout. Donc, vous devriez le mettre dans le dernier différé (celui qui imprime les résultats) où vous êtes sûr de vouloir arrêter votre programme. Juste une note: vous devez utiliser addCallbacks (méthodory1, error_method) pour attraper les erreurs potentielles.


Regardez le didacticiel sur différé sur TwisteDMatrix.com/documents/current/core/howto / ... , en particulier la section nommée 'Callbacks peut retourner différé'.


D'accord merci! Et le seul problème que j'ai maintenant, c'est que j'accède à plusieurs sites et j'essaie d'imprimer les données dans un ordre spécifique, donc si j'ai une fonction pour chaque site, cela pourrait les imprimer en panne ...



8
votes

Qu'est-ce qui semble que vous essayez de faire / gérer plusieurs réacteurs. Tout est attaché au réacteur même em>. Voici comment utiliser un DÉFEREDLIST CODE> A > Attendre que tous vos rappels finissent.

Notez également que Twisamaz code> renvoie une valeur. Cette valeur est passée via le Callbacks code> Déferredlist code> et sort sous la valeur code>. Depuis un DÉFEREDRÉDLIST CODE> conserve l'ordre des choses qui sont placées, vous pouvez transmettre l'indice des résultats avec l'index de vos isbns. P>

from twisted.internet import defer

def twisAmazon(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()


0 commentaires

4
votes

Une autre façon cool de le faire est avec @ Defer.inlinCallbacks. Il vous permet d'écrire du code asynchrone comme une fonction séquentielle régulière: http : //Twistedmatrix.com/documents/8.1.0/api/Twisted.internet.defer.html#inlinCallbacks


0 commentaires