【发布时间】:2018-09-17 21:46:04
【问题描述】:
我正在编写一个包含 20,000 个任务的脚本,每个任务调用一个子进程和一个或两个 TCP 调用。为了不花一整天的时间,我正在使用 Python 的新 asyncio。
但是,我担心在我的脚本运行时 Python 会打印出这些错误:
Exception ignored when trying to write to the signal wakeup fd:
BlockingIOError: [Errno 11] Resource temporarily unavailable
它会打印一堆,但不会引发任何异常。我确实收到了关于Too many open files 的OSErrors 并且之前断开了与服务器的连接,但是我使用信号量一次只允许与每台服务器建立100 个连接,总共只允许700 个连接。
由于 Python 没有引发任何异常,因此我无法捕获错误。但它似乎不会影响脚本。
这些错误是我应该关注的吗?如果是,我需要做些什么来消除它们?如果没有,我该如何摆脱它们,使它们不在我的程序输出中?
另外,如果这些错误很严重,为什么 Python 会忽略它们而不是引发异常?
【问题讨论】:
-
我会担心这个例外。信号唤醒 fd 由 asyncio 使用,因此事件循环在信号上被唤醒; fd 是一个管道,信号处理程序将一个字节写入管道。不能这样做表明该过程中系统资源可能严重不足。尝试找出是什么在占用您的文件描述符,并增加进程的最大允许打开文件数,或者进一步减少程序中打开的最大连接数。
-
@user4815162342 这是有关的。根据
ulimit -a,我的文件限制是1024,通过反复运行ls -l /proc/PID/fd | wc -l,我得到的最高打开文件数是692。我离系统的最大打开文件数还差得很远 -
也许您遇到了其他限制?或者也许这是一个异步问题,其中进程接收到大量信号并且异步没有清除管道(通过读取字节),然后管道被填满。不进一步调试很难判断。
标签: python linux python-3.x python-asyncio