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

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

  1. Первая часть программы берет значения от датчика в реальном времени и строит их, используя Matplotlib. Это должно быть сделано в течение длительного времени. А также, он записывает информацию в базу данных.
  2. Вторая часть - IP-камера. Я должен получить вход от IP-камеры и отобразить его. Для отображения я использую OpenCV imshow метод. Также я храню видео с IP камеры.

Вопрос: У меня есть алгоритмы, проблема в том, что мне нужно запустить оба этих цикла в то время как. Условие - я не могу выйти ни из одного из них. Теперь многопоточность - хорошая альтернатива для этого, но я читал о 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 ответа

Решение

Насколько я понял ваш вопрос, у вас есть две разные задачи, которые вы хотите, чтобы они выполняли постоянно. Теперь по поводу ваших вопросов:

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

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

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

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

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

Почему поток python. Thread имеет начало, а не остановку?

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

Пример примера использования потоков:

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

Для общих ресурсов?

Используйте замки для них. Вот несколько примеров. Раз, два и Как синхронизировать потоки в питоне?

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

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()
Другие вопросы по тегам