A-A+

Error on reading from the event loop self pipe OSError: [WinError 121] 信号灯超时时间已到

2024年08月15日 12:44 学习笔记 暂无评论 共1861字 (阅读162 views次)

【注意:此文章为博主原创文章!转载需注意,请带原文链接,至少也要是txt格式!】

Error on reading from the event loop self pipe
loop: 
Traceback (most recent call last):
  File "X:\Python\Python312\Lib\asyncio\proactor_events.py", line 795, in _loop_self_reading
    f.result()  # may raise
    ^^^^^^^^^^
  File "X:\Python\Python312\Lib\asyncio\windows_events.py", line 803, in _poll
    value = callback(transferred, key, ov)
            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "X:\Python\Python312\Lib\asyncio\windows_events.py", line 462, in finish_socket_func
    return ov.getresult()
           ^^^^^^^^^^^^^^
OSError: [WinError 121] 信号灯超时时间已到

 

这个错误提示是由 Windows 上的 `asyncio` 事件循环引起的,通常与异步 I/O 操作相关。在 Windows 上,`asyncio` 使用 `ProactorEventLoop` 处理 I/O 操作,当 I/O 操作超时时可能会导致 `WinError 121` 错误。这个问题有时会因为系统资源紧张或事件循环处理负担过重而出现。

 

可能的解决方法

1. **切换到 `SelectorEventLoop`**:

- 在 Windows 上,`asyncio` 默认使用 `ProactorEventLoop`,它支持异步网络通信和管道等操作,但在某些情况下会出现这种超时错误。你可以尝试切换到 `SelectorEventLoop`,它使用传统的 `select()` 系统调用,可能更稳定。

 

2. **增加超时时间**:

- 如果切换事件循环后问题依然存在,考虑增加 WebSocket 或其他 I/O 操作的超时时间。

 

3. **简化异步任务**:

- 如果程序中有大量并发任务,尝试简化任务或减少并发任务的数量,看看是否有助于减少超时错误的发生。

 

示例:切换到 `SelectorEventLoop`

import asyncio
import sys

if sys.platform.startswith('win'):
    asyncio.set_event_loop_policy(asyncio.WindowsSelectorEventLoopPolicy())

# Your existing asyncio code here

在 `FastAPI` 或其他异步程序的入口文件中加入上面的代码,以切换到 `SelectorEventLoop`。

 

进一步调试

- **增加日志**:在关键的异步操作前后增加日志,帮助确定哪个操作可能导致了超时。

- **更新 Python 版本**:如果还没有使用最新的 Python 版本,考虑更新到最新版本,可能有一些底层的改进可以解决这个问题。

 

总结

- 这个错误是由于 Windows 上的 `ProactorEventLoop` 处理异步 I/O 操作时超时导致的,切换到 `SelectorEventLoop` 通常可以解决这个问题。

- 尝试增加超时时间或减少并发任务以缓解负担。

- 如果问题依然存在,进一步分析日志和调试信息,或者尝试其他网络环境。

 

 

或参考下面3个方案,选一个

 

# 1. 事件循环策略设置为 WindowsSelectorEventLoopPolicy
policy = asyncio.WindowsSelectorEventLoopPolicy()
asyncio.set_event_loop_policy(policy)

# 2. 设置并发量 < 64
# 如采用信号量Semaphore限制协程数量
semaphore = asyncio.Semaphore(16)

# 3. aiohttp.ClientSession() 中设置参数 trust_env=True,可能会使下载变慢

 


 

通过github发现了也许可能与HTTP Debugger Pro 有关,如下:

 

我终于知道问题所在了,我的电脑里有一款软件HTTPDebugger,就是他搞得鬼,在windows系统中他会自动启动一个【服务】,服务名称叫做HTTP Debugger Pro,将这个服务由【自动】改为【手动】就好了,现在我已经打开spyder3个小时了,并没有再次出现该错误
QQ图片20240519080243
QQ截图20240519080535

而比较巧合的是,我的电脑也有这个进程!images

 

布施恩德可便相知重

微信扫一扫打赏

支付宝扫一扫打赏

×

给我留言