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

Python的threading类没有提供退出方法,退出方法需要自己实现.

这涉及到两个问题:

线程通信:子线程怎么知道父线程让子线程退出.

退出的实现:子线程知道之后该怎么退出

线程通信

threading提供了Event这个类,实际上这个类就是一个信号,可以比较方便的实现线程间通信.因为多线程运行在一个进程中,也可以自己定义一个类来传递信号.略过不表.

# coding:utf-8

import threading

import time

signal = threading.Event() # 定义一个信号

def worker(signal, *args, **kwargs):

"""子线程核心函数

Arguments:

signal {threading.Event} -- 接收的信号

"""

# 如果信号为False,则执行任务

while not signal.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都可以

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值