线程中的注意点
- 主线程会等到所有子线程结束之后才结束
- sub_thread1 = threading.Thread(target=)此时只是创建了一个对象,还没有生成子线程,sub_thread1.start()此时会生成子线程并执行线程,子线程指向的方法或者程序结束后,子线程也自行结束
- 在没有控制的情况下,处理器对于子线程和主线程的控制是无序的
- 并行:真多任务,多核同时运行
并发:假多任务,通过“时间片轮转”或“优先级调度”等算法实现单核多任务
线程的学习内容
创建多线程任务: threading.Thread()
- 上图中有两点注意事项:
- Thread一定要大写
- target后面跟着的是函数或者类的名字,所以不要写()
使用time.sleep控制线程的执行顺序
因为操作系统是无序调用子线程,如果不加以时间控制,则会出现以下情况
例:
上述代码的执行结果如下
可以看出,无论是子线程还是主线程,都是无规则被调用的
下面我们将程序中加上time.sleep()来控制一下被调用顺序:
执行结果如下
可以看出,已经实现顺序执行了
统计当前有多少个子线程:threading.enumerate()
执行结果如下
从enumerate的print中可以看出,一开始包括主线程在内一共三个线程在执行
5秒钟之后子线程1执行结束,列表中变为两个线程
10秒之后子线程2执行结束,列表中只剩下主线程一个
break条件满足,程序结束
在结束之前,对enumerate做一下扩展
enumerate() 函数用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据和数据下标,一般用在 for 循环当中。
例:
1. 当前有以下列表:
如果想获取其中的每一个值,可以使用for循环:
对该字符串使用enumerate()函数,得到以下结果
可以看出,此时的结果是个元组,也就是说此时的name是个元组
既然是元组,我们就可以如下方式拆包:
这样就可以使用元祖中的值了
顺便说一下元组的拆包: