2

複数のポートで実行しようとしている Twisted ソケットがあります。次のコードは以前は機能していましたが、覚えていれば、それ以来コードに触れていないため、約 1 か月前のことです。Twisted プログラムにコードを再入力した後、もう機能しません。

class Socket(Protocol):
    table = Table()

    def connectionMade(self):
        #self.transport.write("""connected""")
        self.factory.clients.append(self)
        print "Clients are ", self.factory.clients

    def connectionLost(self, reason):
        self.factory.clients.remove(self)

    def dataReceived(self, data):
        #print "data is ", data
        a = data.split(':')
        if len(a) > 1:
            command = a[0]
            content = a[1]

            if command == "Number_of_Players":
                msg = table.numberOfPlayers


        print msg

        for c in self.factory.clients:
                c.message(msg)

    def message(self, message):
        self.transport.write(message)

NUM_TABLES = 10

factories = [ ]
for i in range(0, NUM_TABLES):
    print i
    factory = Factory()
    factory.protocol = Socket
    factory.clients = []
    factories.append(factory)
    reactor.listenTCP(1025+i, factory)
    #print "Blackjack server started"
    reactor.run()

通常は、設定した範囲内で何度でも Blackjack server started が表示されますが、現在は表示されません。ループしているかどうかをテストするために、i を出力しようとしましたが、0 しか出力されませんでした。何らかの理由で、for ループは 1 回しかループしませんでした。

助言がありますか?ありがとう!

4

3 に答える 3

5

ねじれたプログラムは、通常、1 つのみreactor実行されます。リアクターを開始 ( .run()) すると、実行がリアクター ループ内を通過することに注意してください (コードで定義した 、 、 などのさまざまなイベントはconnectionMade()connectionLost()それぞれdataReceived()のアクションが発生したときにトリガーされます)。の後のコードは、reactor が停止した後にreactor.run()のみ実行されます。

したがって、コードはforループの最初の反復を通過しません。

reactor.run()ループの外に移動してみてください:

NUM_TABLES = 10

factories = [ ]
for i in range(0, NUM_TABLES):
    print i
    factory = Factory()
    factory.protocol = Socket
    factory.clients = []
    factories.append(factory)
    reactor.listenTCP(1025+i, factory)

# print "Blackjack server started"

reactor.run()

# whatever code you put here, is executed only **after reactor has stopped**
于 2012-06-02T22:13:21.037 に答える
2

何らかのエラー メッセージが表示されますか? 基本的なループに問題はありません。以下のすべての行をコメントアウトしてprint iから、ループが停止するまでそれらを選択的に追加し直すことをお勧めします-これにより、問題の原因がわかります(明らかに2番目の印刷は問題ではありません)

おそらく はlistenTCP()接続を待ってハングしていますか?

または、呼び出している関数の 1 つにある種の無限ループがある可能性があります。他のコードが表示されていないことを確認する唯一の方法は、疑わしいコードをコメントアウトして追加し直すことで、考えられる問題を排除することです。

更新:あなたの新しい情報に基づいて、問題は明らかにreactor.run(). コードが自己完結型である場合は、調査のために投稿できます。

の 2 つの潜在的な問題reactor.code()無限ループ、またはプログラムが何らかのイベント/入力を待機しています。

ループは無限である可能性があります。つまり、コードが正しくないため、開始しても終了しない場合があります。これは、プログラムが一時停止/停止しているように見えます (CPU が狂ったようにクランキングしている場合でも)。または、何らかの入力/イベントを待機している場合、プログラムを一時停止することができます。

于 2012-06-02T21:30:07.797 に答える
1

デバッグ出力に到達する前に例外がスローされました。

表示されているブロックを でラップしてキャッチしtry: ... exceptます。

try:
       reactor.listenTCP(1025+i, factory)
except IOError as (errno, strerror):
    print "I/O error({0}): {1}".format(errno, strerror)
except:
    print "something else happened"
于 2012-06-02T21:30:18.120 に答える