Запуск бесконечных циклов с использованием потоков в python

моя программа разработана следующим образом:

  1. первая часть программы принимает значения в реальном времени от датчика и строит его с помощью библиотек matplotlib. это должно быть сделано в течение длительного времени. Кроме того, он регистрирует информацию в базе данных.
  2. вторая часть-это IP-камера. Я должен получить вход с IP-камеры и отобразить его. Для отображения я использую OpenCV imshow метод. Кроме того, я храню видео с IP Камера.

вопрос: у меня есть алгоритмы на месте, проблема в том, что мне нужно запустить оба эти цикла через некоторое время. Условие в том, что я не могу выйти ни из одного из них. Теперь threading-хорошая альтернатива для этого, но я читал о GIL, так как я могу запустить два бесконечных цикла?

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()

теперь, когда я начинаю процесс p он начинает выполняться, после этого как мне начать p1 запустить одновременно?

2 ответов


как мне запустить два бесконечных цикла?

вы можете создать два разных потока, которые будут запускать эти бесконечные циклы для вас. Первый поток будет выполнять вашу task1, а второй-task2.

кроме того, как только я начну выполнять поток, как мне выполнить другой поток, когда первый поток работает непрерывно / бесконечно?

Если вы используете два разных потока, вам не нужно беспокоиться об этой проблеме. Если потоки не используют какой-либо ресурс, вам не нужно беспокоиться об этом факте. Как бы то ни было, если вы хотите остановить/приостановить один поток из другого потока или наоборот, вы можете реализовать механизм с помощью флагов или блокировок. Эти вопросы помогут в этом дело:

есть ли способ убить поток в Python?

почему поток python.Объект Thread имеет "start", но не "stop"?

создание-программы-munltithreaded

пример пример использования 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

общие ресурсы?

использовать замки для них. Вот несколько примеров. один, два и как синхронизировать потоки в python?

что делать, если я не хочу запускать его с помощью классов? Как это сделать, используя только методы?

from threading import Thread

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

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

if __name__ == "__main__":
    t1 = Thread(target = runA)
    t2 = Thread(target = runB)
    t1.setDaemon(True)
    t2.setDaemon(True)
    t1.start()
    t2.start()
    while True:
        pass

    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()