You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

FastAPI多Worker环境下contextily add_basemap调用导致Worker崩溃问题求助

FastAPI多Worker环境下contextily add_basemap调用导致Worker崩溃问题求助

大家好,我是刚接触contextily和FastAPI多Worker部署的新手,最近遇到了一个随机出现的棘手问题,想请各位帮忙分析下:

我的场景是把FastAPI部署在Docker容器里,设置了4个Worker进程,通过contextily给Matplotlib生成的Axes对象添加底图来制作地图图片。但运行过程中,add_basemap会毫无征兆地触发Worker崩溃,从日志里能看到这样的输出:

fastapi-1 | 2025-07-29 11:40:16,934 - logs_storage.logs_storage - INFO - Saving summary image
fastapi-1 | 2025-07-29 11:40:26,967 - logs_uploader.save_image - WARNING - Adding basemaps timed out after 10 seconds — proceeding without them.
fastapi-1 | INFO: Waiting for child process [361]
fastapi-1 | INFO: Child process [361] died

我一开始觉得用信号量做超时处理应该能隔离add_basemap的异常,不会影响整个Worker,于是写了下面的超时捕获代码,但完全没起作用,Worker还是会崩溃:

class TimeoutException(Exception):
    pass

def _timeout_handler(signum: int, frame) -> None:
    raise TimeoutException("Timeout while adding basemap")

signal.signal(signal.SIGALRM, _timeout_handler)
signal.alarm(ADD_BASEMAP_TIMEOUT)

try:
    ctx.add_basemap(ax, source=ctx.providers.Esri.WorldImagery, crs="EPSG:3857", alpha=1.0)  # pyright: ignore
    ctx.add_basemap(ax, source=ctx.providers.CartoDB.PositronOnlyLabels, crs="EPSG:3857", alpha=0.95)  # pyright: ignore
    _LOGGER.info("Basemaps added successfully")
except TimeoutException:
    _LOGGER.warning(f"Adding basemaps timed out after {ADD_BASEMAP_TIMEOUT} seconds — proceeding without them.")
except Exception as e:
    _LOGGER.warning(f"Error adding basemap: {e}")
finally:
    signal.alarm(0)

后来我还尝试用ThreadPoolExecutor把add_basemap的调用放到单独线程里处理,结果还是没能阻止Worker进程死亡。

有没有朋友遇到过类似的情况?或者能帮我分析下:为什么已经捕获了超时异常,Worker还是会崩溃?有没有什么办法能只让add_basemap的超时/异常被隔离,不影响整个Worker进程的运行?

内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.07 12:43:02