web-dev-qa-db-fra.com

Faire fonctionner 2 fonctions en même temps

J'essaie de faire fonctionner 2 fonctions en même temps.

def func1():
    print 'Working'

def func2():
    print 'Working'

func1()
func2()

Est-ce que quelqu'un sait comment faire ça?

36
John

Faites ceci:

from threading import Thread

def func1():
    print 'Working'

def func2():
    print 'Working'

if __== '__main__':
    Thread(target = func1).start()
    Thread(target = func2).start()
67
chrissygormley

La réponse sur le filetage est bonne, mais vous devez être un peu plus précis sur ce que vous voulez faire.

Si vous avez deux fonctions qui utilisent toutes deux beaucoup de CPU, le threading (en CPython) ne vous mènera probablement nulle part. Ensuite, vous voudrez peut-être jeter un œil au module multiprocessing ou peut-être voudrez-vous utiliser jython/IronPython.

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

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

10
Mattias Nilsson

Une option, qui ressemble à cela fait exécuter deux fonctions en même temps
fois
, utilise le module threading (exemple dans la réponse this ).

Cependant, il a un petit délai, en tant que documentation officielle Python
page décrit. Un meilleur module à essayer est multiprocessing .

En outre, il existe d'autres modules Python qui peuvent être utilisés pour l'exécution asynchrone (deux morceaux de code fonctionnant en même temps Pour obtenir des informations à leur sujet et vous aider à en choisir un, vous pouvez lire this Stack Overflow question.

Commentaire d'un autre utilisateur sur le module threading

Il voudra peut-être savoir qu'en raison du verrouillage d'interprète global
ils ne s'exécuteront pas en même temps, même si la machine en
question a plusieurs processeurs. wiki.python.org/moin/GlobalInterpreterLock

- Jonas Elfström 2 juin 10 à 11:39

Citation de la documentation sur le module threading ne fonctionne pas

Détail d'implémentation de CPython: dans CPython, en raison de l'interpréteur global
Verrouiller, un seul thread peut exécuter Python code à la fois (même si
certaines bibliothèques axées sur les performances pourraient surmonter cette limitation).

Si vous souhaitez que votre application utilise mieux les ressources de calcul des machines multicœurs, il est conseillé d'utiliser le multitraitement ou concurrent.futures.ProcessPoolExecutor.
Cependant, le filetage est toujours un modèle approprié si vous
souhaitez exécuter simultanément plusieurs tâches liées aux E/S.

4
Edward

Cela peut être fait avec élégance avec Ray , un système qui vous permet de paralléliser et de distribuer facilement votre code Python.

Pour paralléliser votre exemple, vous devez définir vos fonctions avec le @ray.remote decorator, Puis les appeler avec .remote.

import ray

ray.init()

# Define functions you want to execute in parallel using 
# the ray.remote decorator.
@ray.remote
def func1():
    print("Working")

@ray.remote
def func2():
    print("Working")

# Execute func1 and func2 in parallel.
ray.get([func1.remote(), func2.remote()])

Si func1() et func2() renvoient des résultats, vous devez réécrire un peu le code ci-dessus, en remplaçant ray.get([func1.remote(), func2.remote()]) par:

ret_id1 = func1.remote()
ret_id2 = func1.remote()
ret1, ret2 = ray.get([ret_id1, ret_id2])

Il y a plusieurs avantages à utiliser Ray par rapport au module multiprocessing ou à utiliser le multithreading. En particulier, le même code s'exécutera sur une seule machine ainsi que sur un cluster de machines.

Pour plus d'avantages de Ray, voir cet article connexe .

2
Ion Stoica

Je pense que ce que vous essayez de transmettre peut être atteint grâce au multitraitement. Cependant, si vous souhaitez le faire via des threads, vous pouvez le faire. Cela pourrait aider

from threading import Thread
import time

def func1():
    print 'Working'
    time.sleep(2)

def func2():
    print 'Working'
    time.sleep(2)

th = Thread(target=func1)
th.start()
th1=Thread(target=func2)
th1.start()
0
Soham Kapoor

Le module de thread fonctionne simultanément contrairement au multiprocessus, mais le timing est un peu décalé. Le code ci-dessous imprime un "1" et un "2". Ils sont appelés respectivement par différentes fonctions. J'ai remarqué que lorsqu'ils étaient imprimés sur la console, ils auraient des horaires légèrement différents.

   from threading import Thread

   def one():
       while(1 == num):
           print("1")
           time.sleep(2)

   def two():
       while(1 == num):
           print("2")
           time.sleep(2)


   p1 = Thread(target = one)
   p2 = Thread(target = two)

   p1.start()
   p2.start()

Sortie: (Notez que l'espace est destiné à l'attente entre les impressions)

   1
   2

   2
   1

   12

   21

   12

   1
   2

Je ne sais pas s'il existe un moyen de corriger cela, ou si cela importe du tout. Juste quelque chose que j'ai remarqué.

0
I506dk

Essayez ceci

from threading import Thread

def fun1():
    print("Working1")
def fun2():
    print("Working2")

t1 = Thread(target=fun1)
t2 = Thread(target=fun2)

t1.start()
t2.start()
0
Shanan Ilen