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
相关产品推荐
相关产品推荐

