如何解决当运行脚本作为执行文件时,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 举报,一经查实,本站将立刻删除。