0

1つのソケットが送信者で、もう1つが受信者である単純な非同期の例を作成しようとしています。何らかの理由で、レシーバーのhandle_read()が呼び出されることはないため、「テスト」データを取得することはありません。誰もが理由を知っていますか?これは非同期での私の最初のショットなので、おそらく非常に単純なものです。

import asyncore, socket, pdb, random

class Sender(asyncore.dispatcher):
    def __init__(self):
        asyncore.dispatcher.__init__(self)
        self.create_socket(socket.AF_INET, socket.SOCK_STREAM)

    def handle_connect(self):
        print ('first connect')

    def writable(self):
        True

    def readable(self):
        return False

    def handle_write(self):
        pass

    def handle_close(self):
        self.close()

class Receiver(asyncore.dispatcher):
    def __init__(self):
        asyncore.dispatcher.__init__(self)
        self.create_socket(socket.AF_INET, socket.SOCK_STREAM)

    def handle_connect(self):
        print ('first connect')

    def readable(self):
        return True

    def handle_read(self):
        print 'reading'

    def handle_write(self):
        print 'write'

    def handle_accept(self):
        self.conn_sock, addr = self.accept()
        print 'accepted'

    def handle_close(self):
        self.close()
a = Sender()
b = Receiver()
addr = ('localhost', 12344)
b.bind(addr)
b.listen(1)
a.connect(addr)
asyncore.loop()
a.send('test')
4

2 に答える 2

1

アレックスが原因を指摘しているため、かなり遅れて問題を解決していませんが、コードは次のことを示しています。

def writable(self):
     True 

それはすべきではありません:

def writable(self):
     return True 
于 2012-06-27T12:46:51.413 に答える
1

asyncore.loopasyncore.loopの終了a.sendにインラインで発生するようにコーディングしているため、は終了しないため、発生しません。

これが修正されると、送信者と受信者を単一のスレッドとプロセス内で実行しているという問題が発生するため、すべてが正しい順序で行われるようにするための非常に繊細な手順を実行しない限り、行き詰まりに陥ります。asyncoreはもちろん、別々に実行されているプロセス間で使用されることを意図しているため、この問題は通常の実際の使用では発生しません。デッドロックが発生している場所を正確に知りたい場合は、asyncoreの独自のコピーを作成し、printステートメントを追加してください。

python -m trace -t ast.py

残念ながら、後者は多くの出力を提供し、重要な変数の値を表示しません。printしたがって、痛みを伴わず、非侵襲的に試すことができますが、戦略的に配置されたいくつかのs(たとえば、各選択の直前と直後のrおよびw fdリスト)よりもはるかに役に立ちません。

私は、選択が1回だけトリガーされると信じています(ただし、これは非現実的なシナリオであるため、詳細にデバッグしていません)(受け入れ/接続ソケットへのバイトの書き込みの両方が最初の選択の前に行われるため、それらは終了します)単一のイベントに「折りたたまれた」)が、その1つのイベントの処理は、折りたたまれていることを認識できないため(通常の使用では発生しません!-)、受け入れ/接続のみを処理します。しかし、時間をかけてより深くデバッグする場合は、この異常なシナリオをよりよく理解できることは間違いありません。

于 2009-10-17T16:18:42.933 に答える