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 faire ça?
7 réponses
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()
La réponse threading 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 les deux beaucoup de CPU, fileter (en CPython) ne vous mènera probablement nulle part. Alors vous pourriez vouloir jeter un oeil au multiprocessing module ou peut-être vous voulez utiliser jython/IronPython.
si la performance liée au CPU est la raison, vous pouvez même implémenter des choses dans (non-threaded) C et obtenir une plus grande vitesse que faire deux choses en parallèle en python.
sans plus d'information, il n'est pas facile de trouver une bonne réponse.
j'ai lancé 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()
C'est de quoi il en retourne:
1447425262.16 1447425263,16
Pour moi, cela semble les fonctions s'exécutent l'une après l'autre...?
une option, qui ressemble à elle fait deux fonctions exécuter à la même
le temps , utilise le module threading
(exemple dans cette" réponse ).
cependant, il a un petit retard, comme une Documentation officielle de Python
page décrit. Un meilleur module à essayer est multiprocessing
.
il y a aussi d'autres modules Python qui peuvent être utilisés pour exécution asynchrone (deux morceaux de code fonctionnant en même temps). Pour obtenir de l'information à leur sujet et de l'aide pour en choisir une, vous pouvez lire cette question de débordement de la pile .
commentaire d'un autre utilisateur sur le threading
module
"151940920 – - Jonas Elfström Jun 2 '10 à 11: 39il pourrait vouloir savoir qu'en raison de L'interprète globale Serrure
ils n'exécuteront pas au même moment même si la machine dans
question a plusieurs CPU. wiki.python.org/moin/GlobalInterpreterLock
citation de la Documentation sur threading
module ne fonctionne pas
CPython détails de mise en œuvre: en CPython, en raison de L'interpréteur Global
Lock, un seul thread peut exécuter du code Python à la fois (même si
certaines bibliothèques axées sur la performance pourraient surmonter cette limitation).si vous voulez que votre application fasse une meilleure utilisation des ressources computationnelles des machines multi-core, il vous est conseillé d'utiliser multiprocessing ou concurrent.avenir.ProcessPoolExecutor.
Cependant, le filetage est toujours un modèle approprié si vous
vous voulez exécuter plusieurs tâches liées aux E/S simultanément.
Essayez cette
from threading import Thread
def fun1():
print("Working1")
def fun2():
print("Working2")
t1 = Thread(target=fun1)
t2 = Thread(target=fun2)
t1.start()
t2.start()
le module thread fonctionne simultanément contrairement à multiprocess, mais le timing est un peu hors tension. Le code ci-dessous imprime un "1" et "2". Ils sont appelés par différentes fonctions respectivement. J'ai remarqué que lorsqu'ils étaient imprimés sur la console, ils avaient des minuteries légèrement différentes.
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 réservé à l'attente entre l'impression)
1
2
2
1
12
21
12
1
2
pas sûr s'il y a un moyen de corriger cela, ou si cela importe à tous. Juste quelque chose que j'ai remarqué.
je pense que ce que vous essayez de transmettre peut être réalisé par multiprocesseur. Cependant, si vous voulez le faire à travers des fils, 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()