Python 在一个程序中多次启动扭曲反应堆?
是否可能在同一程序中多次启动反应堆?假设为了API的目的,您想要在方法中封装twisted功能 例如,mymodule.py如下所示:Python 在一个程序中多次启动扭曲反应堆?,python,twisted,reactor,Python,Twisted,Reactor,是否可能在同一程序中多次启动反应堆?假设为了API的目的,您想要在方法中封装twisted功能 例如,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 pr
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
1 import mymodule
2
3 getGoogle()
4 getYahoo()
main.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
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
更简单的解决方案,不需要您管理计数器:
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()
您应该看看延迟API提供了什么,因为它将为您节省大量时间,并使您的代码更易于调试。即使它可以工作,我也建议不要使用它。很乱。你应该首先附加所有的处理程序和任务,然后运行reactor。据我所知,我认为任务的要求与twisted的要求背道而驰。基本上,任务是创建一个API,因此用户不需要了解twisted。注意,main.py是同步的。或者,mymodule.py不是。谢谢你的评论!我喜欢你的实现。谢谢