python问题解决
python问题解决
1. Python多进程multiprocessing在Windows下运行不了的问题
问题描述
python多进程multiprocessing在Windows的Dos下或者Idle运行不了会出错。
打成exe包双击后会一直打开exe,程序会重复重启,导致内存占满,在linux下确没有问题,
在Pycharm下运行也不会有问题,经过各种查阅资料,终于解决了这个Bug
问题分析
-
无限循环问题:
在Windows环境下,使用multiprocessing创建子进程时,如果主进程是一个.py文件,并且没有使用if name == ‘main’:进行保护,那么当使用pyinstaller打包成exe运行时,可能会发生无限创建进程的死循环,导致系统资源耗尽 。解决这个问题的方法是使用multiprocessing.freeze_support()来阻止子进程运行其后面的代码,这个函数应该在if name == ‘main’:语句块中调用 。 -
进程启动方式问题:
在Windows上,multiprocessing的spawn和forkserver启动方式不能与“冻结的”可执行内容一同使用,例如使用PyInstaller或cx_Freeze打包的程序。fork启动方式可以使用,但需要注意,fork在Windows上并不是真正的fork,而是一个全新的Python解释器进程 。 -
全局变量问题:
在Windows下,多进程是通过启动新进程完成的,所有的全局变量都是重新初始化的,因此在运行过程中动态生成、修改过的全局变量是不能在子进程中使用的 。 -
异常处理问题:
在使用multiprocessing.Pool时,如果子进程中的函数抛出异常而没有被捕获,异常会传递到Pool中,导致整个Pool挂起。解决方法是在子进程执行的函数中添加try-except块来捕获所有可能的异常 。 -
资源传递问题:
在多进程中,应该避免共享资源,尤其是在Windows上,因为每个进程有独立的内存空间。如果需要共享资源,可以使用multiprocessing模块提供的共享内存对象或者Manager来实现,但这样会增加程序复杂度并可能降低效率 。 -
序列化问题:
multiprocessing内部使用pickling传递参数到不同的进程,如果在交互式控制台中定义函数,该函数在新进程中可能不存在,导致序列化失败。因此,应该确保所有用于多进程的函数都在一个模块中定义,并且使用if name == ‘main’:进行保护 。
问题解决
只要添加在main入口下添加 multiprocessing.freeze_support() 就可以了
if __name__ == "__main__":
multiprocessing.freeze_support()
参考:Python多进程multiprocessing在Windows下运行不了的问题
参考:github:Recipe Multiprocessing
2. gradio 出现 Unknown scheme for proxy URL URL
问题解决
- 查看代理设置
env | grep -i proxy
- 关闭代理
unset no_proxy
unset http_proxy
unset https_proxy
unset ftp_proxy
unset NO_PROXY
unset HTTP_PROXY
unset HTTPS_PROXY
unset FTP_PROXY
unset ALL_PROXY
unset all_proxy
unset ALL_PROXY
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐


所有评论(0)