相同Python代码在Heron框架子进程中执行速度异常变慢求助
PNG解码速度在Heron子进程与命令行子进程中的差异排查方向
问题场景
我通过pyzmq套接字接收后台可执行程序传来的PNG字节数据,使用以下代码将其转换为numpy数组:decoded = np.asarray(im.open(io.BytesIO(data)))
- 命令行环境执行该行代码耗时不足1毫秒(已通过Python性能分析工具验证)
- 但在我开发的图形框架Heron启动的独立子进程中执行,耗时约90毫秒
- Heron基于dearpygui实现图形界面,通过0MQ连接多个子进程,负责子进程的启停及进程间消息传输,解码代码运行在Heron启动的子进程内
已完成的排查
- 性能分析显示,Heron子进程中PIL的
PngImagePlugin.py:198(call)等操作耗时16ms,远高于命令行环境 - 直接从命令行启动独立子进程执行同一段代码,耗时仍不足1ms,排除子进程本身的问题,确认差异由Heron启动子进程的方式导致
- 当前环境为Windows10+Python3.9,暂未测试Linux环境
- 已尝试禁用垃圾回收,无效果
Heron启动子进程的代码:
kwargs = {'start_new_session': True} if os.name == 'posix' else {'creationflags':subprocess.CREATE_NEW_PROCESS_GROUP} pid = subprocess.Popen(new_arguments_list, **kwargs).pid
排查方向建议
- 检查子进程优先级与资源限制:Windows下
CREATE_NEW_PROCESS_GROUP可能影响进程优先级,对比命令行子进程和Heron子进程的优先级设置,尝试显式设置子进程的priorityclass(如subprocess.HIGH_PRIORITY_CLASS)测试是否改善 - 排查stdout/stderr重定向影响:Heron启动子进程时是否重定向了标准输出/错误到管道或文件?若存在IO阻塞可能拖慢进程,尝试将子进程的stdout/stderr重定向到
subprocess.DEVNULL测试 - 验证dearpygui对进程环境的修改:Heron主进程基于dearpygui,可能修改了全局系统设置(如GDI资源、线程模型),导致子进程继承异常环境变量或资源状态。尝试在启动子进程前重置图形相关环境变量,或在子进程内显式初始化系统资源
- 对比PIL初始化过程差异:检查命令行子进程与Heron子进程中PIL的初始化步骤,是否存在字体加载、插件注册等额外耗时操作。可在子进程启动时提前初始化PIL,或禁用不必要的PIL插件
- 排查0MQ消息传输开销:确认pyzmq接收数据的过程在Heron子进程中是否存在延迟,比如消息队列积压、接收缓冲区设置不合理。对比两种环境下数据接收的耗时,排除传输阶段的影响
- 测试Windows进程组的副作用:
CREATE_NEW_PROCESS_GROUP会创建新的控制台进程组,可能导致子进程处理系统调用时产生额外开销。尝试去掉该创建标志,用默认方式启动子进程,测试速度是否恢复
内容的提问来源于stack exchange,提问作者g_d
相关产品推荐
相关产品推荐

