python – 扭曲的反应器在一个程序中多次启动?
发布时间:2020-12-20 12:18:15 所属栏目:Python 来源:网络整理
导读:是否可以在同一程序中多次启动反应堆?假设您希望将扭曲的功能封装在方法中,以用于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.st
是否可以在同一程序中多次启动反应堆?假设您希望将扭曲的功能封装在方法中,以用于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() 解决方法
这是组织代码的另一种方法,利用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 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |