2014-04-27 7 views
1

트위스트가 새로 생겼고 간단한 POC를 작성하려고했지만 다음 오류가 계속 발생합니다. 나는 관련 트위스트 문서 및 가이드를 읽고 있고 내가 잘못 알아 작동하지 수twisted deferredlist를 구현하려고 할 때 이상한 동작이 발생했습니다.

running 
[] 
running 
[] 
running 
[] 
running 
[] 
running 
[] 
Traceback (most recent call last): 
    File "./poc.py", line 23, in <module> 
    dl = defer.DeferredList([tasks]) 
    File "/usr/local/lib/python2.7/site-packages/twisted/internet/defer.py", line 820, in __init__ 
    deferred.addCallbacks(self._cbDeferred, self._cbDeferred, 
AttributeError: 'list' object has no attribute 'addCallbacks' 

. 아무도이 예외의 원인을 알고 있습니까?

#!/usr/bin/env python 
from twisted.internet import defer 

def task_to_run(data): 
    print 'running' 
    print data 

def finished(res): 
    print 'finished', res 

tasks = [] 

for x in range(0,5): 
    d = defer.Deferred()  
    d.addCallback(task_to_run) 
    tasks.append(d) 

dl = defer.DeferredList([tasks]) 
dl.addCallback(finished) 

답변

3

, 다음 @Elisha는 당신을 가리키고 문제 (예제 코드는 목록을 나열하고 그렇지 않아야 함). 에있다 DeferredLists에

% ./deferredList.py 
running 
blah - 0 
running 
blah - 1 
running 
blah - 2 
running 
blah - 3 
running 
blah - 4 
finished [(True, None), (True, None), (True, None), (True, None), (True, None)] 

BTW 아주 좋은 문서 :의 출력으로

#!/usr/bin/env python 
from twisted.internet import defer 

def task_to_run(data): 
    print 'running' 
    print data 

def finished(res): 
    print 'finished', res 

tasks = [] 

for x in range(0,5): 
    d = defer.Deferred()  
    d.addCallback(task_to_run) 
    d.callback("blah - " + str(x)) # Fire them as I make them 
    tasks.append(d) 

dl = defer.DeferredList(tasks) 

dl.addCallback(finished) 

: Deferred Reference


그러나 작업이 실제로 실행되지 않을 경우 같은 실행 가능한 코드가 보인다 비동기이면 대기열 지연 대기열을 만들 수 있습니다.

#!/usr/bin/env python 
from twisted.internet import defer 

def task_to_run(data): 
    print 'running' 
    print data 
    return data 

def finished(res): 
    print 'finished', res 

d = defer.Deferred()  

for x in range(0,5): 
    d.addCallback(task_to_run) 

d.addCallback(finished) 

d.callback("blah") # Fire the deferred 
로 5,

런은 :

% ./deferred.py 
running 
blah 
running 
blah 
running 
blah 
running 
blah 
running 
blah 
finished blah 
+0

BTW, 'task_to_run'이 비동기 적이 지 않은 것으로 의심되는 이유는 태스크의 비동기 출력이 ** 예외 ** 이후에 올 것이기 때문입니다. 현재 코드를 실행할 때 예외 이전에 완료된 작업을 표시하면 'DeferredList'가 도움이되지 않습니다 (IE에서 [지연 코드]는 수행하지 않음) (http://twistedmatrix.com/documents/12.3 .0/core/howto/gendefer.html # auto2) 트랩. –

3

tasks은 목록입니다. 다른 목록의 DeferredList으로 전달합니다. 이 일에

dl = defer.DeferredList([tasks]) 

: ([tasks])
난 당신이 라인을 변경할 필요가 있다고 생각 task_to_run 정말 비동기를 실행하는 것을 가정하면

dl = defer.DeferredList(tasks) 
+0

안녕하세요 덕분에 친구하지만 그냥 오타가 있었다 (당신이 게시하기 전에 실제로 닌자 그것을 몇 분 편집). 불행히도 문제는 여전히 존재합니다. – Jamesla

+0

'deferred' 객체 목록 대신 목록 목록을 전달합니다. 오타와 관련된 부분을 제거하기 위해 답을 편집했습니다. – Elisha

관련 문제