0

我有一个监听事件的方法,每次发生事件时,它都应该将数据发送到套接字(它的 udp,所以我不检查是否接收到数据)。

我在 event_handler 中的内容是:

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

在我看来,每次调用事件时我都需要创建一个新套接字,因为我不知道两个事件之间会经过多少时间,所以拥有一个全局套接字变量并在事件上发送数据并不能保证套接字仍在运行。

问题是,因为我每次都创建套接字,我应该在发送数据后处理/关闭它吗?使用后处理或关闭套接字的最佳方法是什么?

4

2 回答 2

2

正如 Rob 已经解释的那样,您不必每次都创建一个新套接字。

根据文档(https://docs.python.org/3/library/socket.html):

套接字在被垃圾回收时会自动关闭,但建议显式地关闭()它们,或者在它们周围使用 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 回答