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?
Faites ceci:
from threading import Thread
def func1():
print 'Working'
def func2():
print 'Working'
if __== '__main__':
Thread(target = func1).start()
Thread(target = func2).start()
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.
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.
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
threading
ne fonctionne pasDé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.
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 .
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()
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é.
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()