python - 在 python 中的类中启动无限循环线程后继续执行代码

标签 python multithreading

在下面的代码中,我尝试每隔特定的时间自动更新两个数据库(rd 和 dtset)。问题是,一旦第一个线程启动,其余代码就不会被执行。

class Engine():

    def __init__(self):
        cfg = SafeConfigParser()
        cfg.read('config.ini')
        self.rd_update_interval = float(cfg.get('settings','RD_UPDATE_INTERVAL'))
        self.dtset_update_interval = float(cfg.get('settings','DTSET_UPDATE_INTERVAL'))

    def start(self):
        rd_thread = threading.Thread(target=self.run_rd_thread(), args=())
        rd_thread.daemon = True                          
        dtset_thread = threading.Thread(target=self.run_dtset_thread(), args=())
        dtset_thread.daemon = True   
        rd_thread.start()
        print "RD automatic update running..."
        dtset_thread.start()
        print "Dtset automatic update running..."

    def run_rd_thread(self):
        while 1:
            try:
                self.update_rd()
            except:
                pass
            time.sleep(self.rd_update_interval)
        return 0

    def run_dtset_thread(self):
        while 1:
            try:
                self.update_dtset()
            except:
                pass
            time.sleep(self.dtset_update_interval)
        return 0

my_engine = Engine()
my_engine.start()

我查看了类似的问题,建议的解决方案是构建单独的 Thread 类并在我的 main 中调用它们,但是没有办法在单个类中执行我想要的操作吗?

最佳答案

rd_thread = threading.Thread(target=self.run_rd_thread(), args=()) 是问题所在。

问题是 target=self.run_rd_thread() 实际上正在运行 run_rd_thread 方法,并尝试将其结果用作参数。您希望将方法本身作为参数传递,而不是方法的结果。

rd_thread = threading.Thread(target=self.run_rd_thread)

应该解决这个问题(您也不需要显式传递 args=(),这是默认值)。

您还需要以相同的方式修复 dtset_thread = threading.Thread(target=self.run_dtset_thread(), args=()) 行。

您的主脚本可能应该在调用 my_engine.start() 后进入无限循环

while True:
    time.sleep(1)

如果您想要更复杂,您可以检查线程是否完成/退出,然后在这种情况下允许主进程退出并显示错误消息。

最后,一些小风格点 - 在 python 中更常见的是使用 while True 而不是 while 1 (即使它们是等效的),而不是当无法到达方法末尾时,不必费心显式地return 0

关于python - 在 python 中的类中启动无限循环线程后继续执行代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34266480/

相关文章:

android - 多线程处理程序与 ThreadPoolExecutor

ruby - 我如何让 ruby​​ 在线程内输出异常?

c# - 我对处理器、内核、线程和并行性的理解是否正确?

python - 如何使用 while 循环从列表中的每个整数中减去最小的数字?

python - 根据字符串值过滤Python列表中的对象

python - 机器学习输入和输出的大小

python - 给用户一个 "reputation system"- 我应该......?

c++ - 我的线程函数不会停止我想要的线程

c# - Linq - 中断存储过程的执行

python - Django 数据库中存储的 csrftoken 在哪里?