0

asyncore ここで使用するいくつかのサンプル コードに従っています。次の完全な例のようにtimeout値を設定しただけです。asyncore.loop

import smtpd
import asyncore

class CustomSMTPServer(smtpd.SMTPServer):

    def process_message(self, peer, mailfrom, rcpttos, data):
        print 'Receiving message from:', peer
        print 'Message addressed from:', mailfrom
        print 'Message addressed to  :', rcpttos
        print 'Message length        :', len(data)
        return

server = CustomSMTPServer(('127.0.0.1', 1025), None)

asyncore.loop(timeout = 1)

1 秒後にタイムアウトが発生すると予想していましたが、そうではありません。コードは 1 秒よりずっと長く実行されます。ここで何が欠けていますか?

4

3 に答える 3

2

へのtimeout引数asyncore.loop()は、select.select呼び出しがデータを待機する時間です。不足する前にデータがない場合は、timeoutループしてselect.select再度呼び出します。

channels考え方も同じ。これは、開いているソケットを意味するのではなく、アクティブasyncore.dispatcherまたはasynchat.async_chatインスタンスを意味します。ループを停止したい場合は、登録されているすべてのインスタンスでclose()メソッドを呼び出す必要があります。

あなたの場合server.close()、インスタンス/チャネルを閉じてasyncoreループから削除します。アクティブなチャネルがなくなると、このループは終了します。

于 2013-01-23T17:29:53.427 に答える
1

timeoutへの引数がasyncore.loop()本当に指定された時間の後に関数呼び出しをタイムアウトにすることを意図しているかどうかは本当にわかりませんがasyncore.loop()、指定された時間の後にその関数をタイムアウトにするためのレシートを次に示します (asyncore.loop()コード例の行を に置き換えます)。

import signal

class TimeoutError(Exception): pass

# define the timeout handler
def handler(signum, frame):
    raise TimeoutError()

# set the timeout handler and the signal duration
signal.signal(signal.SIGALRM, handler)
signal.alarm(1)
try:
    asyncore.loop()
except TimeoutError as exc:
    print "timeout"
finally:
    signal.alarm(0)
于 2013-01-23T17:30:33.890 に答える
0

asyncore.loop() のタイムアウトは、select() のタイムアウトです。

select() がタイムアウトするとループバックするため、役に立ちません。疑似コードを参照してください。

while True:
    do_something()
    select(...)
    do_something_else()

ファイアウォールを使用したソケットでシミュレーションを行うと、Python 2.7.3 asyncore.loop() で、一部のソケットからデータが受信されなくなってから 1 分後にタイムアウトします。

asyncore.dispatcher「サブクラス」に次のメソッドがあると非常に便利であることがわかりました。

def handle_error(self):
    raise

このようにして、「適切な」例外ダンプが得られました。

私は例外を持ちたくなかったので、後で次のように変更しました。

def handle_error(self):
    print "Error downloading %s" % self.host
    pass

これで、私のコードは例外なく正しく動作します。

タイムアウトを制御する方法が見つかりませんでした。

于 2013-04-03T22:07:18.157 に答える