2011-04-29 39 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 2011-04-29 02:53:45

+0

我認爲這個任務的要求是針對我所理解的扭曲的粒子運行的。基本上,任務是創建一個API,這樣用戶需要對扭曲一無所知。請注意,main.py,它是同步的。或者,mymodule.py不是。謝謝你的評論! – 2011-04-29 03:04:21

回答

6

這裏的另一種方式來組織你的代碼,開發的單線程性質扭曲:排隊所有你想要處理的網址,啓動反應堆,並在每個請求完成時遞減一個計數器。當計數器達到零,停止反應器,它會返回結果:

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

我喜歡你的實現。謝謝! – 2011-04-29 03:58:05

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

你應該看一看here延遲的API提供了什麼,因爲它會爲您節省大量時間並使您的代碼更易於調試。