在下面的代码中,我尝试每隔特定的时间自动更新两个数据库(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中调用它们,但是没有办法在单个类中执行我想要的操作吗?
答案 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
。