【问题标题】:BlockingIOError exception ignored; should I be concerned?BlockingIOError 异常被忽略;我应该担心吗?
【发布时间】: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 filesOSErrors 并且之前断开了与服务器的连接,但是我使用信号量一次只允许与每台服务器建立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


【解决方案1】:

看起来限制因素是运行大量短暂的subprocesses。来自Python bug tracker

“尝试写入信号唤醒 fd 时忽略异常”消息来自 Modules/signalmodule.c 中的信号处理程序。问题是 Python 获得了很多 SIGCHLD 信号(测试脚本在我的计算机上每秒创建 +300 个进程)。生产者(将信号编号写入“self”管道的信号处理程序)比消费者(BaseSelectorEventLoop._read_from_self 回调)更快。

有了补丁,我开始收到带有 140 个并发进程的消息,这要好得多 :-) IMO 超过 100 个并发进程太疯狂了,不要在家里这样做 :-) 我的意思是生命周期很短的进程.限制是每秒的 SIGCHLD 数,即在同一秒结束的进程数。

我更改了代码以限制一次可以运行多少个create_subprocess_execes。当我低于 35 时,我不再看到错误,但我可能会将其设置为 20 以确保确定。您的里程可能会有所不同。

async def myTask(stuff, semaphore, loop):
    with semaphore:
        process = await asyncio.create_subprocess_exec('short_program', loop=loop)

def taskRunner(stuffs):
    loop = asyncio.get_event_loop()
    semaphore = asyncio.Semaphore(20)  # limit how many can run at a time
    tasks = [
        asyncio.ensure_future(myTask(semaphore, loop))
        for i in range(20000)
    ]
    loop.run_until_complete(asyncio.gather(*tasks))
    loop.close()

【讨论】:

  • 好好挖掘!您是否在错误跟踪器中提交了报告?原来的issue 应该在几年前修复,但显然问题仍然存在。
  • @user4815162342 问题确实是The patch doesn't solve completly the issue. 我还应该提交报告吗?
  • 我认为你应该这样做。上一期已有四年历史,并且已关闭,因此不太可能有人在研究它。如果您可以提供一个测试用例来重现问题,那将特别有用。
  • 也许它跑题了,但提醒一下,sn-p 中的asyncio.Semaphore 应该与async with 一起使用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-22
相关资源
最近更新 更多