0

イベントをリッスンするメソッドがあり、イベントが発生するたびに、ソケットにデータを送信する必要があります(udpなので、データが受信されたかどうかは確認しません)。

私がevent_handlerに持っているのはこれです:

    socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    socket.sendto(data, (IP, PORT))

イベントが呼び出されるたびに新しいソケットを作成する必要があるように思えます.2つのイベント間でどれくらいの時間が経過するかわからないためです.グローバルソケット変数を持ち、イベントでデータを送信して、ソケットはまだアップしています。

問題は、毎回ソケットを作成するため、データを送信した後に破棄/閉じる必要があるかどうかです。使用後にソケットを処分または閉じる最良の方法は何ですか?

4

2 に答える 2

2

すでに Rob が説明したように、毎回新しいソケットを作成する必要はありません。

ドキュメントに従って(https://docs.python.org/3/library/socket.html):

ガベージ コレクションが行われると、ソケットは自動的に閉じられますが、明示的に close() するか、with ステートメントを使用することをお勧めします。

したがって、毎回作成/閉じることを選択した場合は、次のようにすることができます。

with socket.socket(socket.AF_INET, socket.SOCK_DGRAM) as socket:
    socket.sendto(data, (IP, PORT))
于 2017-01-11T14:46:09.810 に答える
1

イベントが呼び出されるたびに新しいソケットを作成する必要があるように思えますが、

いいえ、以前のソケットを再利用しても問題ありません。UDP ソケットはコネクションレスであるため、接続が切断される心配はありません。

問題は、毎回ソケットを作成するため、データを送信した後に破棄/閉じる必要があるかどうかです。

はい、無数のソケットを作成する場合は、それらを閉じてください。そうしないと、プロセス内の限られたリソースであるファイル記述子スロットが不足します。

于 2017-01-11T14:36:46.913 に答える