对通过threading模块创建新python的thread模块是比较底层的模块,python的threading模块是对thread做了一些封装,可以更加方便的被使用。
模块并没有提供暂停, 恢复和停止线程的方法, 一旦线程对象调用start方法后, 只能等到对应的方法函数运行完毕. 也就是说一旦start后, 线程就属于失控状态. 对于函数中没有循环,可以使用join()来结束循环。
方法一:一般的方法就是循环地判断一个标志位, 一旦标志位到达到预定的值, 就退出循环. 这样就能做到退出线程了. 直到我看到threading中Event对象。对于event.isSet()可以查看event的状态,set()函数返回为True,clear()函数返回为False。
self.__flag.wait() 中self.__flag为True时立即返回, 为False时阻塞直到self.__flag为True后返回
#!/usr/bin/env python
# coding: utf-8
import threading
import time
class Job(threading.Thread):
def __init__(self, *args, **kwargs):
super(Job, self).__init__(*args, **kwargs)
self.__flag = threading.Event() # 用于暂停线程的标识
self.__flag.set() # 设置为True
self.__running = threading.Event() # 用于停止线程的标识
self.__running.set() # 将running设置为True
def run(self):
while self.__running.isSet():
self.__flag.wait() # 为True时立即返回, 为False时阻塞直到self.__flag为True后返回
print (time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()))
time.sleep(1)
def pause(self):
self.__flag.clear() # 设置为False, 让线程阻塞
def resume(self):
self.__flag.set() # 设置为True, 让线程停止阻塞
def stop(self):
self.__flag.set() # 将线程从暂停状态恢复, 如何已经暂停的话
self.__running.clear() # 设置为False
a = Job()
a.start()
time.sleep(3)
a.pause()
time.sleep(3)
a.resume()
# time.sleep(2)
# a.stop()
方法二:1.信号量
也提供acquire方法和release方法,每当调用acquire方法的时候,如果内部计数器大于0,则将其减1,如果内部计数器等于0,则会阻塞该线程,知道有线程调用了release方法将内部计数器更新到大于1位置。class threading.Sempaphore(value = 1) --限制资源的并发访问。semaphore 是一个内部的计数器,它会随着acquire()的请求减小,也会随着release()的
释放增加。这个计数器的值不会小于零,当acquier() 发现计数器的值为0时,那么当前
对象会等待直到其他对象release()为止。acquier(blocking = True ,timeout = None)
release()
对于Thread方法的基本使用
class threading.Thread(group=None, target=None, name=None, args=(), kwargs={}, *, daemon=None)
这个构造函数通常会用一些关键字参数,下面就了解下这些关键字:
group :这个变量作为保留变量,是为了以后扩展用的,暂时可以不用考虑。
target: 是通过run()方法调用的可调用对象。默认为无,这意味着什么都不做。
name:线程的名字。默认情况下,一个唯一的名称是”thread-n”,的形式,其中n是一个小的十进制数。
args:元组参数,为target所调用的。
kwargs:关键字参数的字典,为target所调用的。
daemon: 设置daemon是否daemon 如果没有显示设置,daemon的属性时从当前线程继承。
————————————————
版权声明:本文为CSDN博主「猥琐发育」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_33540705/article/details/90232209