免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 19960 | 回复: 14
打印 上一主题 下一主题

怎么杀死子线程啊 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 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:}

论坛徽章:
0
2 [报告]
发表于 2010-03-09 08:17 |只看该作者
setDaemon(True)

论坛徽章:
0
3 [报告]
发表于 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()

复制代码

论坛徽章:
0
4 [报告]
发表于 2010-03-09 10:56 |只看该作者
抱歉,忘了交代一点,把子线程杀死以后父线程还要继续进行,我在网上查了很多资料说Python不支持杀死子线程,是不是真的没法实现啊

论坛徽章:
0
5 [报告]
发表于 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()
复制代码

论坛徽章:
0
6 [报告]
发表于 2010-03-09 11:55 |只看该作者
如果需要被杀死的那个子线程里面有循环就好了,可以在子线程里面检测全局变量的变化,然后自己结束,但是这个子线程是持续的,怎么在父线程不结束的情况下掐断它呢{:3_199:}

论坛徽章:
0
7 [报告]
发表于 2010-03-09 12:18 |只看该作者
Python 不支持杀死子线程
http://blog.solrex.org/articles/python-thread-cancel.html

很遗憾啊,如果实在没办法只能用进程了

论坛徽章:
0
8 [报告]
发表于 2010-03-09 12:59 |只看该作者
呵呵,是不可以的。

论坛徽章:
0
9 [报告]
发表于 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()  
复制代码

论坛徽章:
0
10 [报告]
发表于 2010-03-09 13:28 |只看该作者
回复 9# luffy.deng


    需要被杀死的那个子线程是持续的,没有循环的(比如一个HttpServer服务),所以子线程也没有机会去循环取读那个全局变量,我在5楼用子线程建了一个孙线程,用孙线程来执行那个持续的任务,用子线程去循环取读那个全局变量,但是子线程退出了孙线程并没有随着子线程退出
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP