Python: Comment faire de programme attendez de la fonction ou de la méthode de l'achèvement

Souvent, il ya un besoin pour le programme à attendre pour une fonction d'achever ses travaux. Parfois c'est l'inverse: il n'est pas nécessaire pour un programme principal à attendre.
J'ai mis un exemple simple. Il y a quatre boutons. En cliquant sur chacun appelle les mêmes calculer() fonction. La seule différence est la façon dont la fonction est appelée.

  1. "Appel direct" appels de bouton calculer() fonction directement. Puisqu'il y a une Fonction " Fin " d'imprimer, il est évident que le programme est en attente pour le calculer la fonction de terminer son travail.
  2. "Appel à l'aide de Filetage" appels de la même fonction, cette fois à l'aide de mécanisme de threading. Depuis le programme imprime: la Fonction de Fin de message immidiately après que le bouton soit presses, je peux conclure que le programme n'attendez pas pour calculer() la fonction à remplir. Comment faire pour remplacer ce comportement? Comment faire de programme attendez jusqu'à calculer() la fonction est fini?
  3. "Appel à l'aide de Multitraitement" boutons utilise le multitraitement de appelez la fonction calculer() fonction.
    Tout comme avec le filetage de multitraitement n'attendez pas pour fonction d'achèvement. Ce que nous avons à mettre en ordre le faire attendre?
  4. "Appel à l'aide de sous-processus" boutons ne fait rien puisque je n'ai pas trouver le moyen d'attirer les sous-processus à exécuter de script interne de la fonction ou de la méthode. Il serait intéressant de voir comment le faire...

Exemple:

from PyQt4 import QtCore, QtGui    
app = QtGui.QApplication(sys.argv)
def calculate(listArg=None):
print '\n\t Starting calculation...'
m=0
for i in range(50000000):
m+=i
print '\t ...calculation completed\n'
class Dialog_01(QtGui.QMainWindow):
def __init__(self):
super(Dialog_01, self).__init__()
myQWidget = QtGui.QWidget()
myBoxLayout = QtGui.QVBoxLayout()       
directCall_button = QtGui.QPushButton("Call Directly")
directCall_button.clicked.connect(self.callDirectly)      
myBoxLayout.addWidget(directCall_button) 
Button_01 = QtGui.QPushButton("Call via Threading")
Button_01.clicked.connect(self.callUsingThreads)
myBoxLayout.addWidget(Button_01)        
Button_02 = QtGui.QPushButton("Call via Multiprocessing")
Button_02.clicked.connect(self.callUsingMultiprocessing)
myBoxLayout.addWidget(Button_02) 
Button_03 = QtGui.QPushButton("Call via Subprocess")
Button_03.clicked.connect(self.callUsingSubprocess)
myBoxLayout.addWidget(Button_03) 
myQWidget.setLayout(myBoxLayout)
self.setCentralWidget(myQWidget)
self.setWindowTitle('Dialog 01')
def callUsingThreads(self):
print '------------------------------- callUsingThreads() ----------------------------------'
import threading
self.myEvent=threading.Event()
self.c_thread=threading.Thread(target=calculate)
self.c_thread.start()  
print "\n\t\t : Function End"
def callUsingMultiprocessing(self):
print '------------------------------- callUsingMultiprocessing() ----------------------------------'
from multiprocessing import Pool
pool = Pool(processes=3)
try: pool.map_async( calculate, ['some'])
except Exception, e: print e 
print "\n\t\t : Function End"
def callDirectly(self):
print '------------------------------- callDirectly() ----------------------------------'
calculate()
print "\n\t\t : Function End"
def callUsingSubprocess(self):
print '------------------------------- callUsingSubprocess() ----------------------------------'
import subprocess 
print '-missing code solution'
print "\n\t\t : Function End"
if __name__ == '__main__':
dialog_1 = Dialog_01()
dialog_1.show()
dialog_1.resize(480,320)
sys.exit(app.exec_())
Je pense que vous voulez voir dans le concept de thread's join() de la méthode.
Je ne suis pas sûr de comprendre pourquoi vous voulez utiliser des threads ou processus si vous voulez le calcul à exécuter de manière synchrone. Pourquoi ne pas simplement de l'exécuter dans les principaux processus/thread?
Je veux juste m'assurer que je sais ce que fait le programme lorsque j'utilise ou n'utilise pas de filetage, de sous-processus et le multitraitement. À part de savoir que faire et comment exactement à ceux des modules de méthodes, il pourrait être utile de savoir comment les contrôler... par exemple, un .méthode join () (filetage module) en fait un programme attendre jusqu'à ce que la fonction a terminé son calcul. Je pense que cela pourrait être assez utile pour savoir..

OriginalL'auteur alphanumeric | 2014-03-17