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

PyInstaller打包带多进程的Streamlit应用出现8501端口占用问题

问题根因

你遇到的报错本质是Windows系统下Python多进程采用spawn启动模式,PyInstaller打包后的可执行文件启动子进程时,会重新完整执行整个主程序的代码,导致子进程也尝试启动Streamlit服务占用8501端口,和主进程的端口监听产生冲突,报错数量和你设置的进程数一致也完全符合该问题的特征。

解决方案

1. 新增多进程打包适配代码

在你的主程序入口最外层添加if __name__ == '__main__'判断,同时加入PyInstaller多进程必须的multiprocessing.freeze_support()调用,所有Streamlit服务启动、页面初始化、全局实例创建的代码必须全部放在该判断块内,确保子进程启动时不会执行Streamlit相关逻辑。
示例代码如下:

import multiprocessing
import streamlit as st

# 业务函数、类定义可以放在判断块外,不会被子进程重复执行启动逻辑
def check_empty_connect_outside(pos, size, outside_tmp):
    # 原有业务逻辑
    pass

class YourBusinessClass:
    def check_outside_multiprocess(self, lst_children_empty, lst_outside):
        # 你原有多进程代码无需修改
        lst_outside_tmp = [(x.pos, x.size) for x in lst_outside]
        if len(lst_children_empty) > 100:
            pool = multiprocessing.Pool(4)
            data = [(x.pos, x.size, lst_outside_tmp) for x in lst_children_empty]
            results = pool.starmap(check_empty_connect_outside, data)
            pool.close()
            pool.join()
        else:
            results = []
            for node in lst_children_empty:
                results.append(check_empty_connect_outside(node.pos, node.size, lst_outside_tmp))
        return results

if __name__ == '__main__':
    # 必须放在所有业务逻辑执行前,适配PyInstaller多进程打包
    multiprocessing.freeze_support()
    # 所有Streamlit相关的启动、页面渲染代码全部放在此处
    st.title("你的应用名称")
    # 剩余业务逻辑代码

2. 检查全局作用域代码

排查是否在if __name__ == '__main__'判断块外存在Streamlit初始化、端口监听、服务启动类的代码,确保这部分逻辑只会在主进程执行,不会被子进程触发。

排查验证思路
  • 在check_empty_connect_outside函数开头增加日志打印,确认子进程启动时是否执行了主程序的Streamlit启动代码,确认根因
  • 临时将进程池大小改为1,验证报错数量是否对应变为1,进一步确认端口冲突和子进程启动的关联

内容的提问来源于stack exchange,提问作者duy anh hoang

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 02:27:02