0

単一のデバイスに接続すると、データが送信されているかどうかを定期的にチェックするために開いた接続を維持するPythonソケット(またはSocketServer)を作成したいと思います。ソケットは1つの接続のみをリッスンします。

例えば:

def get_data(conn):
    response='back atcha'
    data = conn.recv(1024)
    print 'get_data:',data
    if data:
        conn.send(response)

s = open_socket()
conn, addr = s.accept()
while True:
    print 'running'
    time.sleep(1)
    get_data(conn)
    #do other stuff

サーバーソケットがバインドされ、接続が受け入れられると、接続しているクライアントがデータを送信するか、ソケットを閉じるまで、.recvを実行するときにソケットがブロックされます。不規則なデータ(数秒、1日になる可能性があります)を待っていて、その間にプログラムが他のタスクを実行する必要があるため、このブロッキングが問題になります。

サーバーとの間でいつでもデータを送信(または受信)する必要がある可能性があるため、クライアントがソケットを閉じないようにします。これを別のスレッドで実行する唯一の解決策ですか、または接続を永久に維持するようにクライアント/サーバーソケットを設定する簡単な方法があります(これは安全ですか?VLAN上で実行されます)が、データを受信しましたか?

4

1 に答える 1

1

非同期 I/O とも呼ばれるノンブロッキング I/O を探しています。これをブロックする別のスレッドを使用するのは非常に非効率的ですが、かなり簡単です。

Python の非同期 I/O フレームワークには、Twistedを強くお勧めします。標準ライブラリに付属のasyncoreもチェックしてください。

于 2013-03-13T19:57:45.727 に答える