3
我尝试使用多处理来创建一个非阻塞的GUI。 Multiprocessing.Pool.appy_async()函数允许添加回调函数,这使得在完成一项耗时的操作后,可以轻松更新主GUI。但是,当点击button1时,下面的代码仍然被阻塞。我怎样才能修改这个,以便在button1回调执行时,button2仍然有回应。我正在运行python 2.7和多处理0.70a1。如何使用PySide正确使用multiprocessing.Pool来创建一个非阻塞的GUI
from PySide.QtCore import *
from PySide.QtGui import *
import multiprocessing
import time
import sys
def f(x):
'''This is a time-intensive function
'''
y = x*x
time.sleep(2)
return y
class MainWindow(QMainWindow): #You can only add menus to QMainWindows
def __init__(self):
super(MainWindow, self).__init__()
self.pool = multiprocessing.Pool(processes=4)
button1 = QPushButton('Connect', self)
button1.clicked.connect(self.apply_connection)
button2 = QPushButton('Test', self)
button2.clicked.connect(self.apply_test)
self.text = QTextEdit()
vbox1 = QVBoxLayout()
vbox1.addWidget(button1)
vbox1.addWidget(button2)
vbox1.addWidget(self.text)
myframe = QFrame()
myframe.setLayout(vbox1)
self.setCentralWidget(myframe)
self.show() #display and activate focus
self.raise_()
def apply_connection(self):
result = self.pool.apply_async(f, [10], callback=self.update_gui)
result.get(3)
def update_gui(self, result):
self.text.append('Applied connection. Result = %d\n' % result)
def apply_test(self):
self.text.append('Testing\n')
if __name__ == '__main__':
app = QApplication(sys.argv)
gui = MainWindow()
app.exec_()