在下面的代码中,我尝试每隔特定的时间自动更新两个数据库(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/