is possible start reactor more once in same program? suppose wanted encapsulate twisted functionality inside method, api purposes.
for example, mymodule.py looks this:
1 twisted.web.client import getpage 2 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 looks this:
1 import mymodule 2 3 getgoogle() 4 getyahoo()
here's way organize code, exploiting single-threaded nature of twisted: queue urls want process, kick off reactor, , decrement counter when each request completes. when counter reaches zero, stop reactor return results:
from twisted.web.client import getpage 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() url in ('http://www.google.com', 'http://www.yahoo.com', 'idontexist'): g.add(url) results, errors = g.run() print results print errors
Comments
Post a Comment