我有以下UDP类发送大约100Hz的数据数组
from six import string_types
import socket
import struct
def convert_data(iterable):
if isinstance(iterable, string_types):
return str(iterable)
data = tuple(iterable)
format = "{0}H".format(len(data))
print("Sending data:", format, data)
if max(data) > 2**16 - 1:
raise ValueError(max(data))
if min(data) < 0:
raise ValueError(min(data))
return struct.pack(format, *data)
class UDP(object):
def __init__(self, ip, port):
self._ip = ip
self._port = port
self.socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
self.socket.connect((ip, port))
def send_data(self, data):
message = convert_data(data)
return self.socket.sendall(message)
Run Code Online (Sandbox Code Playgroud)
成功发送约一分钟后出现以下错误:
Traceback (most recent call last):
File "take_analogue_data.py", line 13, in <module>
File "take_analogue_data.py", line 8, in main
File "/home/pi/nio-integration/hardware/raspi/UDP.py", line 22, in __init__
File "/usr/lib/python2.7/socket.py", line 187, in __init__
socket.error: [Errno 24] Too many open files
Run Code Online (Sandbox Code Playgroud)
我找了一个解决方案.此Stack Overflow答案建议增加可能的文件数.我真的不认为这是我正在寻找的解决方案.
有什么我可以做的吗?我以为每次关闭连接都可能有效,但我已经玩了很多东西.(我试过了send,- sendall并且sendto- 没有工作过)
注意:我在Raspberry Pi上的Raspbian Wheezy上运行Python2.6
编辑 另一个模块正在发送数据.它可能看起来像
import UDP
udp = UDP.UDP(IP, PORT)
while(True):
udp.send_data(range(8))
sleep(0.01)
Run Code Online (Sandbox Code Playgroud)
可能,你正在为每一次迭代创建一个新的套接字while(True):.进程仅限于可以打开的文件描述符的数量(套接字是fds.)您可以检查/etc/security/limits.conf以查看限制的设置.
完成后应关闭套接字,或者理想情况下,只打开套接字并尽可能重用它.
你说你的其他模块"可能看起来像这样." 该代码片段究竟是什么样子?
我对此表示怀疑,因为如果是这样的话应该只制作一个插座.如果你在实例化UDP对象while,那么上面肯定是你的问题.