2010-06-02 6 views
24

J'essaie d'exécuter 2 fonctions en même temps.Exécuter 2 fonctions en même temps

def func1(): 
    print 'Working' 

def func2(): 
    print 'Working' 

func1() 
func2() 

Est-ce que quelqu'un sait comment faire cela?

+0

Copie possible de [Python: Comment puis-je exécuter des fonctions python en parallèle?] (Http://stackoverflow.com/questions/7207309/python-how-can-i-run-python-functions-in-parallel) – OrangeDog

Répondre

46

Faites ceci:

import threading 
from threading import Thread 

def func1(): 
    print 'Working' 

def func2(): 
    print 'Working' 

if __name__ == '__main__': 
    Thread(target = func1).start() 
    Thread(target = func2).start() 
+12

Il voudra peut-être savoir qu'en raison du verrou Global Interpreter, ils ne s'exécuteront pas exactement au même moment, même si la machine en question a plusieurs processeurs. http://wiki.python.org/moin/GlobalInterpreterLock –

+0

@joaquin - Votre droite, désolé, a oublié de prendre la fonction exectutions après copier et coller. – chrissygormley

+0

ce forkbombs mon système. – KI4JGT

9

The answer about threading est bon, mais vous devez être un peu plus précis sur ce que vous voulez faire.

Si vous avez deux fonctions qui utilisent beaucoup de CPU, le threading (dans CPython) ne vous mènera probablement nulle part. Ensuite, vous voudrez peut-être jeter un oeil à la multiprocessing module ou peut-être vous pourriez vouloir utiliser jython/IronPython.

Si les performances liées à la CPU sont la raison, vous pouvez même implémenter des choses dans C (non-threaded) et obtenir une accélération beaucoup plus grande que de faire deux choses en parallèle dans python.

Sans plus d'informations, il n'est pas facile de trouver une bonne réponse.

5

La méthode utilisant le module threading (décrit dans another réponse à cette question) à
exécuter deux fonctions en même temps semble fonctionner, mais a en fait un petit délai entre, comme
déclaré dans le Official Python Documentation. Une meilleure solution à essayer à la place utilise le multiprocessing module.

En outre, il existe d'autres modules Python utiles qui peuvent être utilisés pour l'exécution asynchrone (deux morceaux de code en même temps). Pour plus d'informations sur le choix de la meilleure option, consultez la question sur le débordement de pile au https://stackoverflow.com/q/2629680/3787376).

Citation de la Documentation Python officiel au sujet threading module ne fonctionne pas:

CPython détail de mise en œuvre: En CPython, en raison de l'interprète mondial Lock, un seul thread peut exécuter du code Python à la fois (même bien que certaines bibliothèques orientées sur les performances puissent surmonter cette limitation). Si vous souhaitez que votre application utilise mieux les ressources de calcul des machines multicœurs, vous devez utiliser multiprocessing ou concurrent.futures.ProcessPoolExecutor. Cependant, l'enfilage est toujours un modèle approprié si vous souhaitez exécuter simultanément plusieurs tâches liées aux E/S .


A comment d'un autre utilisateur sur le threading module:

Il pourrait vouloir savoir qu'en raison de l'interprète de verrouillage global qu'ils ne seront pas exécutés en même temps exacte même si la machine dans question a plusieurs processeurs. wiki.python.org/Moin/GlobalInterpreterLock

- Jonas Elfström Jun 2 '10 at 11:39

+0

J'ajoute time.time() à la fin de chaque fonction print() et limite la boucle à 9 fois sur le code de l'autre réponse. Voici ce que je vois dans mon terminal: ('a', 1509314761.857559) ('a', 1509314761.857664) ('a', 1509314761.85767) ('a', 1509314761.857675) ('a', 1509314761.85768) ('a', 1509314761.857685) ('a', 1509314761.85769) ('a', 1509314761.857695) ('a', 1509314761.857699) ('b', 1509314761.858138) ('b', 1509314761.858224) ('b', 1509314761.858229) ('b', 1509314761.858234) ('b', 1509314761.858244) ('b', 1509314761.858249) ('b', 1509314761.858253) ('b', 1509314761.858258) – weefwefwqg3

+0

Même avec le multitraitement, ce n'est pas vraiment un rite concurrent? l'un court après l'autre. – weefwefwqg3

+1

Nettoyé ma vieille réponse qui était mal écrite (contenu amélioré, rendu plus clair et formaté/mieux structuré). – Edward

5

J'ai couru ce code pour vérifier si les fonctions fonctionnent en même temps:

#! /usr/bin/env python 
import threading 
from threading import Thread 
import time 

def time1(): 
    time.sleep(1) 
    print time.time() 

def time2(): 
    time.sleep(1) 
    print time.time() 

if __name__ == '__main__': 
    Thread(target = time1()).start() 
    Thread(target = time2()).start() 

Voici ce qu'il retourne:

1447425262.16 1447425263.16

Pour moi cette semble que les fonctions fonctionnent les unes après les autres ...?

+0

Ils fonctionnent l'un après l'autre comme le prouve votre expérience, comme le dit la documentation officielle de Python (https://docs.python.org/3.3/library/threading.html). J'ai inclus cette citation sur cette même page de question aussi ([sur ma réponse] (http://stackoverflow.com/a/33064260/3787376)). – Edward

+1

Tard dans la partie mais: La raison pour laquelle cela peut sembler confus est que le paramètre 'target' dans le constructeur 'Thread' n'est pas les fonctions 'time1' et 'time2', mais les valeurs de retour de 'time1()' et ' time2() '(notez les parenthèses). Donc, essentiellement, vous exécutez deux threads avec 'target = None'. Les deux fonctions s'exécutent lorsque vous créez les threads, pas lorsque vous les démarrez. J'espère que cela clarifie toute confusion. –

+0

Il montre différents timing pour moi .. Il ne fonctionne pas en même temps – lalithkumar

Questions connexes