您的位置:首页 > 编程语言 > Python开发

Python守护线程被多次运行的问题【摘记】

2013-03-04 19:08 246 查看
前两天学习Python守护线程的时候逛论坛偶遇这样一个帖子,记录问题如下:

我想在启动web服务器的时候想开启两个线程 threading.Thread , 
t1 = TimeDaemon(60) #这个线程的目的是每隔60秒去数据库查询一次数据(只是测试,实际没这么频繁)。 
t2 = SQLexec(60) #每隔60秒执行一条sql语句 
我把代码放在manage.py里,可是发现 t1 在开始时好像被调用了2次(启动了不只一个线程吧?),我只想在服务器启动时调用一次,不知道该怎么写?? 
mange.py里面是这样写的: 
if __name__ == "__main__": 
   os.environ.setdefault("DJANGO_SETTINGS_MODULE", "MONITOR.settings") 
   from monitor.exec import TimeDaemon,SQLexec 
   t1 = TimeDaemon(60) 
   t2 = SQLexec(60) 
   t1.setDaemon(True) 
   t2.setDaemon(True) 
   t1.start() 
   time.sleep(2) 
   t2.start() 
   from django.core.management import execute_from_command_line 
   execute_from_command_line(sys.argv) 
 
控制台输出是这样的: 
D:\MONITOR>python manage.py runserver 0.0.0.0:8000 
time Thu Jan 17 16:15:44 2013 {} 
sqlexec Thu Jan 17 16:15:46 2013 {} 
time Thu Jan 17 16:15:47 2013 {} 
sqlexec Thu Jan 17 16:15:49 2013 {} 
Validating models... 
 
0 errors found 
Django version 1.4.3, using settings 'DCMONITOR.settings' 
Development server is running at http://0.0.0.0:8000/
Quit the server with CTRL-BREAK. 
time Thu Jan 17 16:16:44 2013 {} 
sqlexec Thu Jan 17 16:16:46 2013 {} 
time Thu Jan 17 16:16:47 2013 {} 
sqlexec Thu Jan 17 16:16:49 2013 {} 
time Thu Jan 17 16:17:44 2013 {} 
sqlexec Thu Jan 17 16:17:46 2013 {} 
time Thu Jan 17 16:17:47 2013 {} 
sqlexec Thu Jan 17 16:17:49 2013 {} 
 
 
初学django,望指教... 

=============================================
下方有一个前辈给了一个解决方案:

class Task:
    Running=False
    @staticmethod
    def Run():
        if Task.Running:return 
        t1 = TimeDaemon(60)
        t2 = SQLexec(60)
        t1.setDaemon(True)
        t2.setDaemon(True)
        t1.start()
        time.sleep(2)
        t2.start()
        Task.Running=True
 
Task.Run()


=======================================
我的笔记:
这里把守护线程的类中run method定义为static,则与实例无关,不需要创建Task实例就可以调用。
但是守护线程运行多次,是因为类实例创建的缘故吗?
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: