按照上述的说明,我们只是会了简单的python关于线程的两种用法;但是具体线程的一些深层次的,比如线程同步,线程安全,线程通信,线程回收这些我们都还没有接触;对于线程池的使用,我们更是没有很好的接触;所以,我觉得我觉得我们应该继续学习对python线程的使用;
1、首先;我们先看下如何进行线程的回收;
thread.join(timeout)
这个表示要进行线程回收;其中timeout单位是s;也就是说,如果超时的话,则不再等待;要对线程进行回收;
import threading
#定义线程要调用的方法,*add可接收多个以非关键字方式传入的参数
def action(*add):
for arc in add:
#调用 getName() 方法获取当前执行该程序的线程名
print(threading.current_thread().getName() +" "+ arc)
#定义为线程方法传入的参数
my_tuple = ("http://c.biancheng.net/python/",\
"http://c.biancheng.net/shell/",\
"http://c.biancheng.net/java/")
#创建线程
thread = threading.Thread(target = action,args =my_tuple)
#启动线程
thread.start()
#指定 thread 线程优先执行完毕
thread.join()
#主线程执行如下语句
for i in range(5):
print(threading.current_thread().getName())
这里有一个比较有意思的事情;如果我们不传参数的话,那么就会一直等待这个线程执行完毕;你看我们执行了start,然后就会一直执行完毕;这样的话就变成了类似于同步的感觉;
2、守护线程
此类线程的特点是,当程序中主线程及所有非守护线程执行结束时,未执行完毕的守护线程也会随之消亡(进行死亡状态),程序将结束运行。
前面章节中,我们学习了 2 种创建线程的方式,守护线程本质也是线程,因此其创建方式和普通线程一样,唯一不同之处在于,将普通线程设为守护线程,需通过线程对象调用其 damon 属性,将该属性的值该为 True。
并且需要注意的一点是,线程对象调用 daemon 属性必须在调用 start() 方法之前,否则 Python 解释器将报 RuntimeError 错误。
import threading
#定义线程要调用的方法,*add可接收多个以非关键字方式传入的参数
def action(length):
for arc in range(length):
#调用 getName() 方法获取当前执行该程序的线程名
print(threading.current_thread().getName()+" "+str(arc))
#创建线程
thread = threading.Thread(target = action,args =(20,))
#将thread设置为守护线程
thread.daemon = True
#启动线程
thread.start()
#主线程执行如下语句
for i in range(5):
print(threading.current_thread().getName())
=======================================================================================
这里稍微的加两个知识点;一个就是sleep函数;time.sleep(secs)表示的是要延时多少s;
2、如果要输出一个%,那么应该是"%%",这样才会输出一个%;这些记住了即可;
=======================================================================================