为了账号安全,请及时绑定邮箱和手机立即绑定

我想问一下,tkinter 做多线程爬虫,让他停止该怎么做 quit 和 exit 都是直接退出程序

我想问一下,tkinter 做多线程爬虫,让他停止该怎么做 quit 和 exit 都是直接退出程序

吃鸡游戏 2019-05-20 16:58:41
thread=threading.Thread(target=self.threading_run);thread.start()passdefthreading_run_s(self):print("-----------****************++++++++")print(url)forxbinrange(10):print(xb)output.Output(str(xb))time.sleep(10)
查看完整描述

2 回答

?
qq_遁去的一_1

TA贡献1725条经验 获得超7个赞

Python的threading类没有提供退出方法,退出方法需要自己实现.这涉及到两个问题:
线程通信:子线程怎么知道父线程让子线程退出.
退出的实现:子线程知道之后该怎么退出
线程通信
threading提供了Event这个类,实际上这个类就是一个信号,可以比较方便的实现线程间通信.因为多线程运行在一个进程中,也可以自己定义一个类来传递信号.略过不表.
#coding:utf-8
importthreading
importtime
signal=threading.Event()#定义一个信号
defworker(signal,*args,**kwargs):
"""子线程核心函数
Arguments:
signal{threading.Event}--接收的信号
"""
#如果信号为False,则执行任务
whilenotsignal.isSet():
#执行工作
print("working")
time.sleep(1)
print("exiting")
#信号为True时,退出子线程
exit()
t=threading.Thread(target=worker,args=(signal,))
t.start()
time.sleep(2)
print(u"发送退出信号")
signal.set()
time.sleep(1.5)
print(u"当前子线程的状态为{}".format(t.isAlive()))
time.sleep(1)
输出
working
working
发送退出信号
exiting
当前子线程的状态为False
在子线程内部调用exit(),是退出子线程而不是退出主线程,调用位置的问题.
退出线程
退出线程有很多办法,不过核心就是判断信号的状态.这就需要在worker流程控制中加好判断点位.要明确退出不是指令发出去立刻就会执行,而是处理信号的代码发现了信号改变才会停止worker,这个是需要自己实现的.比如上方代码在signal.isSet()发生改变之后,跳出了while循环,实际上worker已经结束了,exit方法是为了增加可读性的,完全没必要加.通过任何方法结束线程都可以,运行完毕或者手动exit都可以
                            
查看完整回答
反对 回复 2019-05-20
  • 2 回答
  • 0 关注
  • 1283 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信