繁体   English   中英

使用线程同时运行两个包含无限循环的方法的首选方法是什么?

[英]What is the preferred way of running two methods containing infinite loops concurrently using threads?

我正在尝试组合我目前单独运行的两个 python3 脚本。 两者都在无限循环中运行。 我找到了不同的方法来实现我想要的,但我是一个初学者,仍在学习并尝试以正确的方式去做。

一个脚本是一个 reddit 机器人,它回复某些评论并上传视频,同时将链接保存在新创建的 .txt 文件中。 另一个遍历那些.txt 文件,读取它们,有时会删除它们。

这个品种对我来说似乎是最直观的:

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

这是运行线程的首选方式吗? 为什么我需要

While True:
    pass

在最后?

一般来说,这是启动两个线程的好方法,但有一些细节需要考虑。

请注意,在该代码中,实际上有 3 个线程:主线程、t1 和 t2。

由于评论说一个线程下载而另一个读取下载的文件,并且由于主线程在您的情况下什么都不做,我会说您只需要这么多:

def download_forever():
    while True:
        download_stuff()


def process_new_downloads():
    do_something_with_new_downloads_here


def main():
    download_thread = Thread(target=download_forever)
    download_thread.start()
    while True:
        process_new_downloads()
        sleep(1)  # let go of the CPU for a while, there's nothing to do anyway

将线程设置为守护进程不会改变它们的生存方式,只会改变它们的死亡方式。 在这里还不清楚整个事情是如何结束的,所以我不确定你是否需要它。 您可能希望实现一些礼貌地停止线程的方法。 您还可以定义某种方式来结束整个事情。

另外,您可以实现一种方法,让一个线程在有新事情要做时准确地唤醒另一个线程。 您可以使用threading.Event来做到这一点。

顺便说一句,原始代码中主线程中的while True正是需要的,因为所有其他线程都是守护进程,因此结束主线程(即不让它永远运行)会杀死整个应用程序。

答案是视情况而定。 如果你想共享一些代码,全局变量,文件描述符,信号量......线程是最好的选择,确实。 与进程相比,它们真的很轻,硬币的另一面是,你必须温和地管理竞争条件,死锁。 和活锁。 一切都是共享的,线程之间没有保护。

另一方面,进程有自己的虚拟空间(进程的上下文、代码、数据和堆栈),它们之间受到保护,因此更安全。 但是它们之间的通信更加复杂。

看这个帖子的线程

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM