Я пишу небольшое чувствительное ко времени приложение, которое должно выполнять 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
Я не могу понять, как заставить его работать ...
Любой совет будет очень признателен ..
Спасибо






Вы по ошибке использовали в потоках Twisted API, не поддерживающие потоки. В этом случае у них есть неопределенное поведение.
Если вы передаете функцию в deferToThread, в первом приближении вы не должны использовать какие-либо Twisted API в реализации этой функции.
Спасибо за указатель. В итоге я решил обойти это, используя MaybeDeferred: a = defer.maybeDeferred (dnc.dnc_sipcode, dest_num, sessionID) b = defer.maybeDeferred (mobile.mobile_sipcode, dest_num, sessionID)