web-dev-qa-db-fra.com

Exécution de boucles infinies à l'aide de threads en python

Mon programme est conçu de la manière suivante:

  1. La première partie du programme prend les valeurs en temps réel d'un capteur et les représente à l'aide de Matplotlib. Cela doit être fait pour de longues durées. Et aussi, il enregistre des informations dans une base de données.
  2. La deuxième partie est la caméra IP. Je dois obtenir l'entrée d'une caméra IP et l'afficher. Pour l'affichage, j'utilise la méthode imshow d'OpenCV. En outre, je stocke la vidéo de la caméra IP.

Question: J'ai les algorithmes en place, le problème est que je dois exécuter ces deux boucles dans un moment. La condition est que je ne puisse sortir d'aucun d'eux. Maintenant, le threading est une bonne alternative à cela, mais j'ai lu sur le GIL, alors comment faire pour exécuter deux boucles infinies?

from multiprocessing import Process

def methodA():
    while TRUE:
        do something

def methodB():
    while TRUE:
        do something

p=Process(target=methodA())
p.start()
p1=Process(target=methodB())
p1.start()

Maintenant, lorsque je lance le processus p, il commence à s'exécuter. Après cela, comment puis-je démarrer p1 pour s'exécuter simultanément?

11

Si j'ai bien compris votre question, vous souhaitez que ces tâches soient exécutées de manière continue. Maintenant, concernant vos questions:

comment puis-je exécuter deux boucles infinies?

Vous pouvez créer deux threads différents qui exécuteront ces boucles infinies pour vous. Le premier thread effectuera votre tâche1 et le second exécutera tâche2. 

Aussi, une fois que je commence à exécuter un thread, comment puis-je exécuter l'autre thread quand le premier thread tourne continuellement/infiniment?

Si vous utilisez deux threads différents, vous n'avez pas à vous inquiéter de ce problème. Si les threads ne partagent aucune ressource, vous n'avez pas à vous soucier de ce fait . Cependant, si vous souhaitez arrêter/suspendre un thread de l'autre thread ou inversement, vous pouvez implémenter un mécanisme à l'aide de drapeaux ou serrures. Ces questions aideront dans ce cas:

Est-il possible de tuer un fil en Python?

Pourquoi l'objet threading.Thread python a-t-il 'démarrer', mais pas 'arrêter'?

faire-un-programme-munltithreaded

Exemple d'exemple utilisant threading:

from threading import Thread

class myClassA(Thread):
    def __init__(self):
        Thread.__init__(self)
        self.daemon = True
        self.start()
    def run(self):
        while True:
            print 'A'

class myClassB(Thread):
    def __init__(self):
        Thread.__init__(self)
        self.daemon = True
        self.start()
    def run(self):
        while True:
            print 'B'


myClassA()
myClassB()
while True:
    pass

Pour les ressources partagées?

Utilisez Serrures pour eux. Voici quelques exemples. One , two et Comment synchroniser les discussions en python?

Et si je ne veux pas l'exécuter avec des classes? Comment est-ce que je fais ceci en utilisant seulement des méthodes?

from threading import Thread

def runA():
    while True:
        print 'A\n'

def runB():
    while True:
        print 'B\n'

if __== "__main__":
    t1 = Thread(target = runA)
    t2 = Thread(target = runB)
    t1.setDaemon(True)
    t2.setDaemon(True)
    t1.start()
    t2.start()
    while True:
        pass
26
ρss
    from threading import Thread
import time

class PrintA(Thread):
    def __init__(self):
        Thread.__init__(self)
        self.running = True

    def run(self):
        while self.running:
            print('A')
            time.sleep(1)
    def stop(self):
        self.running = False

class PrintB(Thread):
    def __init__(self):
        Thread.__init__(self)
        self.running = True
    def run(self):
        while self.running:
            print('B')
            time.sleep(2)
    def stop(self):
        self.running = False

a = PrintA()
b = PrintB()

a.start()
b.start()

time.sleep(10)
a.stop()
time.sleep(10)
b.stop()