1

以下のコードは、AMPに関するTwistedのドキュメント(リンク)から抜粋したものです。コールバックがdに追加されると、自動的に「プロトコル」引数が追加され、reactor.run()が呼び出されたときにdeferredが自動的に実行されます。

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()

私のコードでは、cocos2dでpyglet-twisted(link)を使用していることを除いて、すべてがまったく同じです。そのため、reactorはアプリケーションと同時に起動するため、reactor.run()を呼び出すことはできません。

react.run()を呼び出すと、reactorがすでに実行されているというエラーが表示されます。

そうしないと、延期されたものは呼び出されないようです。

私はreactor.callLater、reactor.callWhenRunningでそれを呼び出そうとしましたが、両方とも引数が必要です。Noneの受け渡しは機能しません。

だから私の質問は、reactor.run()を呼び出さずにこれをこの遅延実行にするにはどうすればよいかということです。

ありがとう!

4

2 に答える 2

1

TwistedのAPIのいくつかは、リアクターを実行しなくても成功します。リアクターはI/Oを実行する責任があります。接続を設定するには、(エンドポイントオブジェクトまたは他のAPIを使用しているかどうかに関係なく)実行中のreactorが必要です。

私の知る限り、ピグレット統合リアクターは自動的に起動しません。何かがその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 に答える
1

さらに調査した結果、deferred返品元 endpoint.connect()が呼び出されなかった理由はcocos2dのバグであることがわかりました。

の下部にcocos.directorpyglet.app.event_loop行のディレクターのイベントを処理するために割り当てられていますdirector.event = event_loop.event

代わりにを使用するように変更する必要がありpygletreactorますeventloop。したがって、上記のコードを次のように変更する必要があります。

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