加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读