Создание программы Python ждать, пока скрученная отсрочка не возвращает значение

StackOverflow https://stackoverflow.com/questions/3488854

  •  28-09-2019
  •  | 
  •  

Вопрос

У меня есть программа, которая выбирает информацию с других страниц и анализирует их, используя Beautifulsoup и Groupage. Позже в программе я печатаю информацию о том, что отложенный процесс создает. В настоящее время моя программа пытается распечатать его до того, как разные возвращает информацию. Как я могу заставить это ждать?

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
Это было полезно?

Решение

Как кажется, вы пытаетесь сделать / запустить несколько реакторов. Все привязано к такой же реактор. Вот как использовать DeferredList ждать всех ваших обратных вызовов, чтобы закончить.

Также обратите внимание twisAmaz Возвращает значение. Это значение пропускается через callbacks DeferredList и выходит как value. Отказ С А. DeferredList Сохраняет порядок вещей, которые введены в него, вы можете пересекать индекс результатов с индексом ваших ISBN.

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

Другие советы

Еще один прохладный способ сделать это с @ Defer.inlineCallbacks. Это позволяет писать асинхронный код, как обычная последовательная функция: http://twisteddmatrix.com/documents/8.1.0/api/twisted.internet.defer.html#inlineLbacks.

Во-первых, вы не должны помещать реактор .Stop () в вашем отложенном методе, поскольку он убивает все.

Теперь, в скрученном, «ожидание» не допускается. Чтобы распечатать результаты вашего обратного вызова, просто добавьте еще один обратный вызов после первого.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top