在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中使用线程运行无限循环的主要内容,如果未能解决你的问题,请参考以下文章

如何将运行无限循环的线程限制为 1 个核心?

为啥我在无限循环中休眠的 python 脚本停止运行?

每个循环可能会或可能不会运行 CDialog 的无限线程

具有无限循环和 thread.sleep 高 CPU 使用率的多个线程

从管道读取的无限循环线程进入 timed_waiting

当主线程无限循环运行时,服务器没有收到用 QTcpSocket::write 写入的字节?