Python &引用;OSError:[Errno 24]打开的文件太多:";使用来自aiocap context.request()的套接字

Python &引用;OSError:[Errno 24]打开的文件太多:";使用来自aiocap context.request()的套接字,python,raspberry-pi,python-asyncio,coap,Python,Raspberry Pi,Python Asyncio,Coap,您好,我正在开发一个树莓PI,该PI应该能够从连接到此PI的传感器持续发送数据,因此下面是我的脚本: import logging import asyncio from grovepi import* import time import json from aiocoap import * logging.basicConfig(level=logging.INFO) def createMsg( file,value ) : f= open(file + "Config.j

您好,我正在开发一个树莓PI,该PI应该能够从连接到此PI的传感器持续发送数据,因此下面是我的脚本:

import logging
import asyncio
from grovepi import*

import time
import json

from aiocoap import *

logging.basicConfig(level=logging.INFO)

def createMsg( file,value ) :
    f= open(file + "Config.json")
    data = json.load(f)
    f.close()
    data["timestamp"] = str(round(time.time(), 3))
    data["value"] = value
    return json.dumps( data )

async def main():

    #analog
    soundSensorPort=0
    lightSensorPort=1

    #digital
    motionSensorPort=2
    tempSensorPort=2
    ultrasonicSensorPort=5
    pinMode(tempSensorPort, "INPUT")

    while True:
        context = await Context.create_client_context()

        await asyncio.sleep(2)
        [ tempSensorValue, humiditySensorValue ]  = dht(tempSensorPort, 0)
        tempMsg = createMsg( "temperatureSensor", tempSensorValue)
        humidityMsg = createMsg( "humiditySensor", humiditySensorValue)

        payloadTemp = tempMsg.encode('utf-8')
        payloadHumidity = humidityMsg.encode('utf-8')
        requestTemp = Message(code=PUT, payload=payloadTemp)
        requestHumidity = Message(code=PUT, payload=payloadHumidity)

        requestTemp.opt.uri_host = '129.6.60.38'
        requestHumidity.opt.uri_host = '129.6.60.38'

        requestTemp.opt.uri_path = ("other", "sensors","temperature")
        requestHumidity.opt.uri_path = ("other", "sensors","humidity")

        responseTemp = await context.request(requestTemp).response
        responseHumidity = await context.request(requestHumidity).response

        print('Result: %s\n%r'%(responseTemp.code, responseTemp.payload))
        print('Result: %s\n%r'%(responseHumidity.code, responseHumidity.payload))

if __name__ == "__main__":
    asyncio.get_event_loop().run_until_complete(main())
但在运行20/25分钟后,我出现了以下错误:

File "clientPUT.py", line 84, in <module>
  File "/usr/lib/python3.5/asyncio/base_events.py", line 466, in run_until_complete
  File "/usr/lib/python3.5/asyncio/futures.py", line 293, in result
  File "/usr/lib/python3.5/asyncio/tasks.py", line 239, in _step
  File "clientPUT.py", line 63, in main
  File "clientPUT.py", line 27, in createMsg
OSError: [Errno 24] Too many open files: 'temperatureSensorConfig.json'

考虑到CoAP同时作为服务器和客户机工作的性质,即使当前没有任何请求处于活动状态,aiocoap上下文也会准备好对包作出反应,并且会一直持续到使用
.shutdown()
协同程序关闭它为止。根据平台的不同,这通常意味着在每个上下文中至少创建一个服务器套接字,当创建的文件太多时,可能会导致文件描述符耗尽


除了极少数例外,应用程序没有理由创建多个上下文。由于这似乎是一个常见的误解,文档正在更新,以使这一点更加明确。

鉴于CoAP同时作为服务器和客户端工作的性质,AIOCAP上下文准备在当前没有活动请求的情况下对包作出反应,并一直持续到使用
.shutdown()将其关闭为止
coroutine。根据平台的不同,这通常意味着在每个上下文中至少创建一个服务器套接字,当创建的文件太多时,可能会导致文件描述符耗尽


除了极少数例外,应用程序没有理由创建多个上下文。由于这似乎是一个常见的误解,文档正在更新以使这一点更加明确。

请参阅我文章中的编辑0。(顺便问一下,配置文件是否在运行时发生更改?如果没有,我会考虑在启动时只读取JSON文件,而不是每次尝试制定新消息时重读和重写JSON文件。它不能解决网络套接字没有被关闭的问题,但如果没有其他的话,效率将得到提高。。在启动时一次读取10个文件比在每个轮询周期读取10个文件要便宜得多。如果在启动时您还不知道名称,您可以缓存它们,并且只有在要求您读取尚未看到的文件时才进行读取。顺便问一句,您确定这真的是asyncio而不是AioCap造成了网络流量吗?如果不知道,请更新标题和进一步标记。@CharlesDuffy:或者API是预期的,而OP没有这样做。请参阅我文章中的编辑0。(顺便问一下,配置文件是否在运行时发生更改?如果没有,我会考虑在启动时只读取JSON文件,而不是每次尝试制定新消息时重读和重写JSON文件。它不能解决网络套接字没有被关闭的问题,但如果没有其他的话,效率将得到提高。。在启动时一次读取10个文件比在每个轮询周期读取10个文件要便宜得多。如果在启动时您还不知道名称,您可以缓存它们,并且只有在要求您读取尚未看到的文件时才进行读取。顺便问一句,您确定这真的是asyncio而不是AioCap造成了网络流量吗?如果不知道,请更新标题和进一步的标记。@CharlesDuffy:或者这些API是有意的,而OP并没有这样做。
total 0
lrwx------ 1 root root 64 Jun 20 15:38 0 -> /dev/pts/0
lrwx------ 1 root root 64 Jun 20 15:38 1 -> /dev/pts/0
lrwx------ 1 root root 64 Jun 20 15:39 10 -> socket:[155862]
lrwx------ 1 root root 64 Jun 20 15:39 11 -> socket:[155876]
lrwx------ 1 root root 64 Jun 20 15:39 12 -> socket:[155877]
lrwx------ 1 root root 64 Jun 20 15:39 13 -> socket:[155878]
lrwx------ 1 root root 64 Jun 20 15:39 14 -> socket:[155879]
lrwx------ 1 root root 64 Jun 20 15:39 15 -> socket:[155880]
lrwx------ 1 root root 64 Jun 20 15:39 16 -> socket:[155882]
lrwx------ 1 root root 64 Jun 20 15:39 17 -> socket:[154981]
lrwx------ 1 root root 64 Jun 20 15:39 18 -> socket:[154982]
lrwx------ 1 root root 64 Jun 20 15:39 19 -> socket:[153455]
lrwx------ 1 root root 64 Jun 20 15:38 2 -> /dev/pts/0
lrwx------ 1 root root 64 Jun 20 15:39 20 -> socket:[156950]
lrwx------ 1 root root 64 Jun 20 15:39 21 -> socket:[156951]
lrwx------ 1 root root 64 Jun 20 15:39 22 -> socket:[156952]
lrwx------ 1 root root 64 Jun 20 15:39 23 -> socket:[156953]
lrwx------ 1 root root 64 Jun 20 15:39 24 -> socket:[153456]
lrwx------ 1 root root 64 Jun 20 15:39 25 -> socket:[156954]
lrwx------ 1 root root 64 Jun 20 15:39 26 -> socket:[156955]
lrwx------ 1 root root 64 Jun 20 15:39 27 -> socket:[156956]
lrwx------ 1 root root 64 Jun 20 15:39 28 -> socket:[156957]
lrwx------ 1 root root 64 Jun 20 15:39 29 -> socket:[156958]
lrwx------ 1 root root 64 Jun 20 15:38 3 -> /dev/i2c-1
lrwx------ 1 root root 64 Jun 20 15:39 30 -> socket:[156959]
lrwx------ 1 root root 64 Jun 20 15:39 31 -> socket:[156960]
lrwx------ 1 root root 64 Jun 20 15:39 32 -> socket:[156961]
lrwx------ 1 root root 64 Jun 20 15:39 33 -> socket:[156962]
lrwx------ 1 root root 64 Jun 20 15:39 34 -> socket:[156964]
lrwx------ 1 root root 64 Jun 20 15:39 35 -> socket:[156965]
lrwx------ 1 root root 64 Jun 20 15:39 36 -> socket:[156966]
lrwx------ 1 root root 64 Jun 20 15:39 37 -> socket:[156998]
lrwx------ 1 root root 64 Jun 20 15:39 38 -> socket:[154984]
lrwx------ 1 root root 64 Jun 20 15:39 39 -> socket:[155903]
lrwx------ 1 root root 64 Jun 20 15:38 4 -> anon_inode:[eventpoll]
lrwx------ 1 root root 64 Jun 20 15:39 40 -> socket:[155906]
lrwx------ 1 root root 64 Jun 20 15:39 41 -> socket:[153492]
lrwx------ 1 root root 64 Jun 20 15:39 42 -> socket:[153498]
lrwx------ 1 root root 64 Jun 20 15:39 43 -> socket:[153502]
lrwx------ 1 root root 64 Jun 20 15:39 44 -> socket:[155930]
lrwx------ 1 root root 64 Jun 20 15:39 5 -> socket:[155855]
lrwx------ 1 root root 64 Jun 20 15:39 6 -> socket:[155856]
lrwx------ 1 root root 64 Jun 20 15:38 7 -> socket:[155859]
lrwx------ 1 root root 64 Jun 20 15:39 8 -> socket:[155860]
lrwx------ 1 root root 64 Jun 20 15:39 9 -> socket:[155861]