Запуск бесконечных циклов с использованием потоков в Python
Моя программа разработана следующим образом:
- Первая часть программы берет значения от датчика в реальном времени и строит их, используя Matplotlib. Это должно быть сделано в течение длительного времени. А также, он записывает информацию в базу данных.
- Вторая часть - 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()