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

时间:2015-12-14 11:57:48

标签: 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中调用它们,但是没有办法在单个类中执行我想要的操作吗?

1 个答案:

答案 0 :(得分:1)

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