Ошибка утверждения в DeferredList

Я пишу небольшое чувствительное ко времени приложение, которое должно выполнять 2 задачи параллельно:

@inlineCallbacks
def mobile_sipcode(self,number,sessionID): 
    '''This method dips into REST api page'''
    taskStartTime = time.time()

    is_mobile = False 

    payload = {'login':self.dip_username,'pass':self.dip_pass,'tn':number}

    try: 
        resp = yield requests.post(self.dip_url,data=payload,timeout=15)        
    except Exception as err: 
        log.msg ('%s MOBILE_CHECK post has failed with error: %s'%(sessionID,err))


    if DEBUG>25:log.msg('%s MOBILE_CHECK finished for %s Mobile:%s task took: %s'%(sessionID, number, is_mobile,time.time()-taskStartTime))         

    if is_mobile:
        returnValue ('501')
    else:
        returnValue ('200') 



@inlineCallbacks
def dnc_sipcode(self,number,sessionID): 
    '''This method dips into REDIS'''
    taskStartTime = time.time()

    is_dnc = yield self.rdspool.sismember(self.dncRedisKey,number)

    if DEBUG>25:log.msg('%s DNC_CHECK finshed returning %s task took: %s'%(sessionID, is_dnc,time.time()-taskStartTime)) 

    if is_dnc:
        returnValue ('410')
    else:
        returnValue ('200')



@inlineCallbacks
def main ():
    #list of callbacks 
    callbacks_refs = []

    a = threads.deferToThread(dnc_sipcode,dest_num,sessionID)
    b = threads.deferToThread(mobile_sipcode,dest_num,sessionID)

    callbacks_refs.append(a)
    callbacks_refs.append(b)

    try:
        results = yield defer.DeferredList(callbacks_refs)
    except Exception as err:
        log.msg('%s RENDER_RESPONSE results: %s  FAILED WITH ERROR %s '%(sessionID, dest_num,err))

    for result in results:
        log.msg('%s RENDER_RESPONSE phone: %s results from callback list is %s '%(sessionID, dest_num,result))   

При срабатывании триггера код в обоих методах выполняется правильно, как я вижу вывод log.msg, однако каждый по-прежнему выдает следующее исключение:

    [-] Unhandled Error
    Traceback (most recent call last):
    File "~lib/python2.7/site-packages/twisted/application/app.py", line 399, in startReactor
    self.config, oldstdout, oldstderr, self.profiler, reactor)
    File "~lib/python2.7/site-packages/twisted/application/app.py", line 312, in runReactorWithLogging
    reactor.run()
    File "~lib/python2.7/site-packages/twisted/internet/base.py", line 1261, in run
    self.mainLoop()
    File "~lib/python2.7/site-packages/twisted/internet/base.py", line 1270, in mainLoop
    self.runUntilCurrent()
    --- <exception caught here> ---
    File "~lib/python2.7/site-packages/twisted/internet/base.py", line 869, in runUntilCurrent
    f(*a, **kw)
    File "~lib/python2.7/site-packages/twisted/internet/defer.py", line 458, in callback
    assert not isinstance(result, Deferred)
    exceptions.AssertionError:

который останавливает выполнение кода после results = yield defer.DeferredList (callbacks_refs) блок.

Исключение похоже на описание в списках рассылки: https://twistedmatrix.com/pipermail/twisted-python/2007-October/016128.html

Я не могу понять, как заставить его работать ...

Любой совет будет очень признателен ..

Спасибо

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
252
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы по ошибке использовали в потоках Twisted API, не поддерживающие потоки. В этом случае у них есть неопределенное поведение.

Если вы передаете функцию в deferToThread, в первом приближении вы не должны использовать какие-либо Twisted API в реализации этой функции.

Спасибо за указатель. В итоге я решил обойти это, используя MaybeDeferred: a = defer.maybeDeferred (dnc.dnc_sipcode, dest_num, sessionID) b = defer.maybeDeferred (mobile.mobile_sipcode, dest_num, sessionID‌)

Alex 30.07.2018 22:30

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