python应用中使用了multiprocessing多进程,使用pyinstaller打包出来的程序可能产生多个窗口

问题现象

我用pyside(类似pyqt)开发了一个应用程序。直接使用pycharm运行,一切都正常。但当我使用pyinstaller将它打包之后,再去运运行,发现窗口总是产生多个。

问题分析

直接运行没有问题,那么问题肯定和pyinstaller相关。在网上搜索之后发现是由多进程引起的(multiprocessing模块)。
在他的wiki中有说明:

使用该multiprocessing模块时,必须调用
multiprocessing.freeze_support()
紧接在if name == ‘main’:主模块行之后。

这在Python官方文档中也有说明:
multiprocessing.freeze_support()
添加对使用multiprocessing已冻结的程序生成 Windows 可执行文件的支持。(已使用py2exe、 PyInstaller和cx_Freeze进行测试。)

需要在主模块行之后直接调用此函数。例如:if __name__ == '__main__'

from multiprocessing import Process, freeze_support

def f():
    print('hello world!')

if __name__ == '__main__':
    freeze_support()
    Process(target=f).start()

如果freeze_support()省略该行,则尝试运行冻结的可执行文件将引发RuntimeError。

在 Windows 以外的任何操作系统上调用时,调用freeze_support()都无效。另外,如果该模块在Windows上由Python解释器正常运行(程序没有被冻结),则freeze_support()没有任何影响。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 下面是一个使用python `multiprocessing` 模块实现多进程的示例代码: ``` import multiprocessing def worker(number): print(f'Worker {number} is running') if __name__ == '__main__': for i in range(5): p = multiprocessing.Process(target=worker, args=(i,)) p.start() ``` 这段代码创建了5个进程,每个进程都执行`worker`函数,并打印出进程编号。 ### 回答2: 下面是一个使用Python multiprocessing模块实现多进程的示例代码: ```python import multiprocessing def worker(name): print(f'Worker {name} 执行') if __name__ == '__main__': processes = [] for i in range(5): p = multiprocessing.Process(target=worker, args=(i,)) processes.append(p) p.start() for p in processes: p.join() ``` 以上代码创建了5个进程,并通过worker函数在每个进程执行一些任务。在主程序的主函数,先创建一个进程列表用于存储即将被创建的进程对象。 在for循环,通过multiprocessing.Process类创建一个进程对象,将要执行的任务指定为worker函数,并传递一个参数i给worker函数。然后将新创建的进程对象添加到进程列表。 接着,使用p.start()启动每个进程。 最后,使用p.join()等待每个进程执行完毕,确保所有进程都执行完毕后再继续主程序的执行。 运行以上代码,你会看到五个进程同时被创建并执行,不同进程之间的输出顺序可能会有不同。 ### 回答3: 多进程可以通过Pythonmultiprocessing模块来实现。下面是一个使用Python multiprocessing模块实现多进程的示例代码: ```python import multiprocessing def worker(num): """Worker function""" print(f'Worker {num} started') # do some work print(f'Worker {num} finished') if __name__ == '__main__': # 创建多个进程 processes = [] for i in range(5): p = multiprocessing.Process(target=worker, args=(i,)) processes.append(p) p.start() # 等待进程结束 for process in processes: process.join() ``` 在上述代码,我们首先定义了worker函数作为每个进程要执行的任务。然后,在主程序使用for循环创建了5个进程,并将它们存储在一个列表。每个进程使用multiprocessing.Process类创建,并指定了要执行的目标函数和传递给它的参数。然后,我们通过调用start()方法来启动每个进程。 在所有进程都启动后,我们通过调用join()方法来等待每个进程的结束。这样可以确保主程序在所有子进程执行完毕之前不会退出。 运行上面的代码,你会看到每个进程都会输出"Worker x started"和"Worker x finished"的信息,其x是进程的编号。 使用Pythonmultiprocessing模块可以帮助我们实现多进程编程,从而在计算机上同时执行多个任务,提高程序的运行效率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值