2011-04-29 4 views
3

동일한 프로그램에서 원자로를 두 번 이상 가동 할 수 있습니까? API 용도로 메서드 내에서 꼬인 기능을 캡슐화하려고한다고 가정합니다. 예를 들어하나의 프로그램에서 여러 번 시작되는 트위스트 반응기?

는 mymodule.py은 다음과 같습니다

1 from twisted.web.client import getPage 
    2 from twisted.internet import reactor 
    3 
    4 def _result(r): 
    5  print r 
    6  reactor.stop() 
    7 
    8 def _error(e): 
    9  print e 
10  reactor.stop() 
11 
12 def getGoogle(): 
13  d = getPage('http://www.google.com') 
14  d.addCallbacks(_result, _error) 
15  reactor.run() 
16 
17 def getYahoo(): 
18  d = getPage('http://www.yahoo.com') 
19  d.addCallbacks(_result, _error) 
20  reactor.run() 
21 

main.py는 다음과 같습니다

1 import mymodule 
    2 
    3 getGoogle() 
    4 getYahoo() 
+0

작동하는 경우에도 나는 그에 대한 조언을 구할 것입니다. 지저분 해. 먼저 모든 핸들러와 작업을 첨부 한 다음 원자로를 실행해야합니다. – slezica

+0

작업에 대한 요구 사항은 내가 이해하는 것에서 뒤틀린 곡식에 맞춰 움직이는 것 같습니다. 기본적으로 작업은 API를 작성하여 사용자가 뒤틀린 것에 대해 알 필요가 없도록합니다. 참고, main.py, 그것은 동기식입니다. mymodule.py는 그렇지 않습니다. 귀하의 의견을 보내 주셔서 감사합니다! –

답변

6

다음의 단일 스레드 특성을 이용하여 코드를 구성하는 또 다른 방법입니다 Twisted : 처리하려는 모든 URL을 큐에 넣고, 반응기를 시작하고, 각 요청이 완료 될 때 카운터를 감소시킵니다.

from twisted.web.client import getPage 
from twisted.internet import reactor 

class Getter(object): 

    def __init__(self): 
     self._sequence = 0 
     self._results = [] 
     self._errors = [] 

    def add(self, url): 
     d = getPage(url) 
     d.addCallbacks(self._on_success, self._on_error) 
     d.addCallback(self._on_finish) 
     self._sequence += 1 

    def _on_finish(self, *narg): 
     self._sequence -= 1 
     if not self._sequence: 
      reactor.stop() 

    _on_success = lambda self, *res: self._results.append(res) 
    _on_error = lambda self, *err: self._errors.append(err) 

    def run(self): 
     reactor.run() 
     return self._results, self._errors 

g = Getter() 
for url in ('http://www.google.com', 'http://www.yahoo.com', 'idontexist'): 
    g.add(url) 
results, errors = g.run() 
print results 
print errors 
+0

귀하의 구현이 마음에 듭니다. 감사! –

6

카운터 관리 할 필요가 없습니다 더 간단 솔루션 :

from twisted.internet import reactor, defer 
from twisted.web.client import getPage 

def printPage(page): 
    print page 

def printError(err): 
    print err 

urls = ['http://www.google.com', 
     'http://www.example.com'] 

jobs = [] 
for url in urls: 
    jobs.append(getPage(url).addCallbacks(printPage, 
              printError)) 

def done(ignored): 
    reactor.stop() 
defer.gatherResults(jobs).addCallback(done) 

reactor.run() 

당신은 살펴 보셔야를 카운터가 0에 도달하면 결과를 반환하는, 원자로 정지 here은 지연된 API에서 제공하는 기능을 제공하므로 많은 시간을 절약하고 코드를 디버그하기 쉽습니다.

관련 문제