python - Twisted reactor starting multiple times in a single program? -


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