当运行脚本作为执行文件时,ProcessPoolExecutor将启动N个新窗口

问题描述

我有一个脚本,该脚本在一个线程中启动PyQt gui,在另一个线程中启动计算(多进程计算)。问题是当我(使用pyinstaller)将.py文件转换为.exe文件时,每个新创建的进程从“如果 name ==' main '”的启动命令都具有这种行为我只能从.exe文件复制(从.py文件启动脚本时,它是正确的) 有人遇到过同样的问题吗? 您可以通过使用pyinstaller和上面的代码创建exe文件来重现此行为(如果您将其作为py文件启动,则此行为会消失):

from PyQt5 import QtCore,QtWidgets
from PyQt5.QtCore import QRunnable,QThreadPool
from PyQt5.QtCore import *

import queue as Queue
from concurrent.futures import ProcesspoolExecutor

import sys

import time
import psutil

n_cores = psutil.cpu_count(logical=False)

def func2(args):
    ##some calculations
    print('Finish')

def func1_():

    print('Calculation using {} cores'.format(n_cores))

    with ProcesspoolExecutor(n_cores) as ex:
            args = ((i) for i in range(n_cores))
            ex.map(func2,args)



class Worker ( QRunnable ):
        def __init__(self,queue):
            QRunnable.__init__ ( self )

        def run(self):
            func1_ ()

class GUI ( QtWidgets.QMainWindow ):

    def __init__(self):
        super ().__init__ ()
        self.setupUi ( self )

    def setupUi(self,MainWindow):

        self.centralwidget = QtWidgets.QWidget ( MainWindow )
        MainWindow.setCentralWidget ( self.centralwidget )

        self.startButton = QtWidgets.QPushButton ( self.centralwidget )
        self.startButton.setText('Press')
        self.startButton.clicked.connect ( self.startCalc )

    def startCalc(self):

        self.queue = Queue.Queue ()
        self.threadpool = QThreadPool ()
        print ( "Multithreading with maximum %d threads" % self.threadpool.maxThreadCount () )
        worker = Worker ( self.queue )
        self.threadpool.start ( worker )
def main():
    global window
    app = QtWidgets.QApplication(sys.argv)
    window = GUI()
    window.show()

    try:
        sys.exit(app.exec_())
    except:
        print("Exiting")
if __name__ == '__main__':  # Если мы запускаем файл напрямую,а не импортируем
    print('thread start and name is',__name__)
    main()  # то запускаем функцию main()

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)