1

下面的代码取自 Twisted 关于 AMP 的文档(链接)。当回调被添加到 d 时,会自动添加一个“协议”参数,并且在调用 reactor.run() 时会自动运行延迟。

def connect():
    endpoint = TCP4ClientEndpoint(reactor, "127.0.0.1", 8750)
    factory = Factory()
    factory.protocol = AMP
    return endpoint.connect(factory)

d = connect()
def connected(protocol):
    return protocol.callRemote(
        RegisterUser,
        username=u'alice'
d.addCallback(connected)

reactor.run()

在我的代码中,一切都完全相同,除了我一直在使用 pyglet-twisted ( link ) 和 cocos2d,所以我不能调用 reactor.run() 因为反应器与应用程序同时启动。

如果我调用 reactor.run(),我会收到一条错误消息,指出反应器已经在运行。

如果我不这样做,deferred 似乎不会被调用。

我一直在尝试用 reactor.callLater、reactor.callWhenRunning 来调用它,但两者都需要一个参数。传递 None 不起作用。

所以我的问题是,我应该如何在不调用 reactor.run() 的情况下使其延迟运行。

谢谢!

4

2 回答 2

1

经过更多研究,我发现没有调用deferred返回 的原因是 cocos2d 的错误。endpoint.connect()

在底部cocos.director, wherepyglet.app.event_loop被分配来处理导演的事件director.event = event_loop.event

这需要改为使用pygletreactor's eventloop。所以上面的代码需要改成如下:

import pygletreactor
event_loop = pygletreactor.EventLoop()
director = Director()
director.event = event_loop.event
于 2013-02-08T22:57:26.003 回答
1

如果没有运行的反应器,很少有 Twisted 的 API 会成功。反应器负责执行I/O。您必须有一个正在运行的反应器才能建立连接(无论您使用的是端点对象还是其他 API)。

据我所知,pyglet 集成反应器不会自动启动。有些东西必须调用它的run方法。您的问题表明您没有调用它,所以我很好奇它的名称是什么。

当我修改您的示例以使其完整且可运行并添加错误报告时,如下所示:

from pygletreactor import install
install()

from twisted.internet import reactor
from twisted.internet.endpoints import TCP4ClientEndpoint
from twisted.internet.protocol import Factory
from twisted.protocols.amp import AMP
from twisted.python.log import err

def connect():
    endpoint = TCP4ClientEndpoint(reactor, "127.0.0.1", 8750)
    factory = Factory()
    factory.protocol = AMP
    return endpoint.connect(factory)

d = connect()
def connected(protocol):
    return protocol.callRemote(
        RegisterUser,
        username=u'alice')
d.addCallback(connected)
d.addErrback(err)

reactor.run()

然后我得到了我期望的行为,即尝试连接然后失败(因为我没有在任何地方运行 AMP 服务器):

Unhandled Error
Traceback (most recent call last):
Failure: twisted.internet.error.ConnectionRefusedError: Connection was refused by other side: 111: Connection refused.

也许您可以将其与您的完整程序进行比较,并找到一个重要的区别。

于 2013-02-07T22:36:32.200 回答