Запуск бесконечных циклов с использованием потоков в python
моя программа разработана следующим образом:
- первая часть программы принимает значения в реальном времени от датчика и строит его с помощью библиотек matplotlib. это должно быть сделано в течение длительного времени. Кроме того, он регистрирует информацию в базе данных.
- вторая часть-это 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()