Chinaunix

标题: 怎么杀死子线程啊 [打印本页]

作者: 盖茨他爹    时间: 2010-03-08 23:41
标题: 怎么杀死子线程啊
  1. #!/usr/bin/python
  2. # -*- coding: UTF-8 -*-

  3. import time
  4. import thread

  5. def son(xxx,yyy):
  6.     time.sleep(10000)

  7. def father():
  8.     thread.start_new_thread(son,(1,2))
  9.     time.sleep(10)
  10.     #10秒钟后杀死子线程,在这里怎么操作啊

  11. if __name__ == "__main__":
  12.     father()
复制代码
假定子线程是持续执行的,没有循环(没法让son自己thread.exit()),怎么在子线程外部杀死它啊,也就是在父线程father()里面进行怎样的操作才能杀死son啊,如果thread不行用threading也行,高手支个招啊,在Google和百度上搜了一晚上的资料了{:3_184:}
作者: luffy.deng    时间: 2010-03-09 08:17
setDaemon(True)
作者: marryton007    时间: 2010-03-09 09:19
setDaemon() 是可以退出,但不能干净的退出,如果子线程中正在进行某项关键性的任务,也许需要在退出前做一些保存或清理工作,这时用setDaemon就不太合适了,比如:

  1. #!/usr/bin/python
  2. # -*- coding: utf-8 -*-

  3. import time
  4. import threading


  5. def son(xxx,yyy):
  6.     fd = None
  7.     try:
  8.         fd = open('/tmp/axx.txt', 'w')
  9.         while 1:
  10.             time.sleep(1)
  11.             fd.write("I am aliving\n")
  12.     except Exception,ex:
  13.         raise
  14.     finally:
  15.         print "close the open file"
  16.         if fd:
  17.             fd.close()
  18.         


  19. def father():
  20.     t = threading.Thread(target=son,args=(1,2))
  21.     t.setDaemon(True)
  22.     t.start()
  23.     time.sleep(10)
  24.     #10秒钟后杀死子线程,在这里怎么操作啊


  25. if __name__ == "__main__":
  26.     father()

复制代码

作者: 盖茨他爹    时间: 2010-03-09 10:56
抱歉,忘了交代一点,把子线程杀死以后父线程还要继续进行,我在网上查了很多资料说Python不支持杀死子线程,是不是真的没法实现啊
作者: 盖茨他爹    时间: 2010-03-09 11:47
刚才用子线程又建了一个孙线程,企图用子线程结束的方式结束孙线程,结果发现孙线程并不会随着子线程的退出而退出,而是随着父线程的退出而退出{:3_188:}
  1. #!/usr/bin/python
  2. # -*- coding: UTF-8 -*-

  3. import time
  4. import thread
  5. import threading

  6. flag = 0

  7. def grandson(xxx,yyy):
  8.     for i in range(0,20):
  9.         time.sleep(1)
  10.         print "grandson"


  11. def son(xxx,yyy):
  12.     global flag
  13.     u = threading.Thread(target=grandson,args=(1,2))
  14.     u.setDaemon(True)
  15.     u.start()
  16.     while True:
  17.         if flag == 1:
  18.             break
  19.         time.sleep(1)
  20.         print "son"

  21. def father():
  22.     global flag
  23.     t = threading.Thread(target=son,args=(1,2))
  24.     t.setDaemon(True)
  25.     t.start()
  26.     i = 0
  27.     while True:
  28.         if i == 5:
  29.             flag = 1
  30.         time.sleep(1)
  31.         i = i + 1
  32.         print "father"

  33. if __name__ == "__main__":
  34.     father()
复制代码

作者: 盖茨他爹    时间: 2010-03-09 11:55
如果需要被杀死的那个子线程里面有循环就好了,可以在子线程里面检测全局变量的变化,然后自己结束,但是这个子线程是持续的,怎么在父线程不结束的情况下掐断它呢{:3_199:}
作者: 盖茨他爹    时间: 2010-03-09 12:18
Python 不支持杀死子线程
http://blog.solrex.org/articles/python-thread-cancel.html

很遗憾啊,如果实在没办法只能用进程了
作者: smallfish_xy    时间: 2010-03-09 12:59
呵呵,是不可以的。
作者: luffy.deng    时间: 2010-03-09 12:59
回复 7# 盖茨他爹

可以设置一个全局变量,通知子线程结束,比如
  1. import threading  
  2. import time
  3. flag=1
  4. class timer(threading.Thread):
  5.     def run(self):
  6.         global flag
  7.         while flag==1:
  8.             print flag
  9.             print 'Thread Object (%d), Time:%s'%(1,time.ctime())   
  10.             time.sleep(1)

  11. def test():
  12.     global flag
  13.     threadone=timer()   
  14.     threadone.start()
  15.     time.sleep(5)
  16.     flag=0
  17.       
  18. if __name__=='__main__':   
  19.     test()  
复制代码

作者: 盖茨他爹    时间: 2010-03-09 13:28
回复 9# luffy.deng


    需要被杀死的那个子线程是持续的,没有循环的(比如一个HttpServer服务),所以子线程也没有机会去循环取读那个全局变量,我在5楼用子线程建了一个孙线程,用孙线程来执行那个持续的任务,用子线程去循环取读那个全局变量,但是子线程退出了孙线程并没有随着子线程退出
作者: luffy.deng    时间: 2010-03-09 13:33
本帖最后由 luffy.deng 于 2010-03-09 14:39 编辑

回复 10# 盖茨他爹
作者: luffy.deng    时间: 2010-03-09 14:38
回复 10# 盖茨他爹

没有循环怎么持续?
作者: 盖茨他爹    时间: 2010-03-09 15:12
比如用execfile执行web.py的WEB服务
  1. execfile("code.py")
复制代码

作者: luffy.deng    时间: 2010-03-09 21:10
本帖最后由 luffy.deng 于 2010-03-09 21:12 编辑
需要被杀死的那个子线程是持续的,没有循环的(比如一个HttpServer服务),所以子线程也没有机会去循环取读那个全局变量,我在5楼用子线程建了一个孙线程,用孙线程来执行那个持续的任务,用子线程去循环取读那个全局变量,但是子线程退出了孙线程并没有随着子线程退出
盖茨他爹 发表于 2010-03-09 13:28



   

setdaemon没有父子孙这样的概念吧,只会随主线程退出而退出。不知道你的具体应用,如果主线程里有部分任务需要继续执行你可以把这些任务单独放到一个线程里。比如  主线程开两个线程 t1   t2 ,t1里是主线程退出后要继续执行的任务,t2是execfile的任务 t2设置setdaemon(true),必要的时候把主线程结束t2结束,t1继续执行。
作者: 盖茨他爹    时间: 2010-03-10 12:14
回复 14# luffy.deng


    这个方法不错,以前没想到过{:3_189:} ,以后遇到需要杀死子线程的就这么做。不过我现在这个项目用不上了,是有“开始按钮”和“停止按钮”那种,也就是说子线程随时可开可关,并不是关闭一次子线程就不开了




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2