在python中使用线程运行无限循环
Posted
技术标签:
【中文标题】在python中使用线程运行无限循环【英文标题】:Running infinite loops using threads in python 【发布时间】:2014-05-30 19:26:38 【问题描述】:我的程序是这样设计的:
-
程序的第一部分从传感器获取实时值并使用 Matplotlib 绘制它。这必须长时间完成。此外,它将信息记录到数据库中。
第二部分是网络摄像机。我必须从 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
以同时运行?
【问题讨论】:
如果您唯一关心的是运行无限循环,那么使用多线程并没有真正的问题。 另外,一旦我开始执行一个线程,当第一个线程连续/无限运行时如何执行另一个线程? 我不明白你的意思。有两个不同的线程并行执行。除非一个依赖于另一个,否则你没有真正的问题。 一个方法无限运行,我在一个线程中启动它,现在如何运行另一个线程?等等,我将添加一些代码来阐明问题。 @gravetii 请查看更新后的问题。我希望它有所帮助。 【参考方案1】:据我了解您的问题,您有两个不同的任务需要他们连续执行。现在关于您的问题:
如何运行两个无限循环?
您可以创建两个不同的线程来为您运行这些无限循环。第一个线程将执行您的 task1,第二个线程将执行 task2。
另外,一旦我开始执行一个线程,我该如何执行另一个 当第一个线程连续/无限运行时线程?
如果您使用两个不同的线程,那么您不必担心这个问题。如果线程不共享任何资源,那么您无需担心这个事实。 但是,如果您想从另一个线程停止/暂停一个线程,反之亦然,那么您可以使用标志或锁来实现一种机制。在这种情况下,这些问题会有所帮助:
Is there any way to kill a Thread in Python?
Why does the python threading.Thread object has 'start', but not 'stop'?
making-a-program-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
对于共享资源?
为他们使用Locks。这里有些例子。 One、two 和 How to synchronize threads in 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
【讨论】:
如果您还没有这样做,请检查更新的问题,它会更清楚地说明情况。 如果他们共享资源我该怎么办? 哇!感谢您的回答。我试过了,效果很好!只是一些问题,你为什么将Thread
传递给班级?如果我不想使用类来运行它怎么办?如何仅使用方法来做到这一点?
点赞!如何暂停和恢复它们或监视它们?
而不是在每个线程的最后加入方法调用的无限循环将是最佳的。 t1.join(), t2.join()【参考方案2】:
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()
【讨论】:
做得很好,但是有没有办法在完成一次后重用这个线程?以上是关于在python中使用线程运行无限循环的主要内容,如果未能解决你的问题,请参考以下文章