1.threading的四种基本操作
a.查看已激活线程
b.查看所有线程信息
c.查看正在运行的线程信息
d.添加线程
显示结果:
2.threading的join()操作__join:将被join的线程加入主线程
a.没有join操作
结果:
可以看出:先进行T1>>T2>>主线程>>T2先完成>>T1先完成
b.进行join()操作
结果
可看出 先完成T2(没有延迟)>>T1>>最后ALL DONE
3.Queue来进行存储(线程不能return,只能q.put(), 主程序中q.get())
以前的线程都是没有返回值的
结果:
P.S 线程其实并不能真正的加速计算过程____GIL机制
线面的程序用来具体测试加入线程和不加入线程的程序运行时间
GIL机制:
Global Interpreter Lock(GIL)
这个东西让 Python 还是一次性只能处理一个东西.
尽管Python完全支持多线程编程, 但是解释器的C语言实现部分在完全并行执行时并不是线程安全的。 实际上,解释器被一个全局解释器锁保护着,它确保任何时候都只有一个Python线程执行。 GIL最大的问题就是Python的多线程程序并不能利用多核CPU的优势 (比如一个使用了多个线程的计算密集型程序只会在一个单CPU上面运行)。
只会影响到那些严重依赖CPU的程序(比如计算型的)。 如果你的程序大部分只会涉及到I/O,比如网络交互,那么使用多线程就很合适, 因为它们大部分时间都在等待。实际上,你完全可以放心的创建几千个Python线程, 现代操作系统运行这么多线程没有任何压力,没啥可担心的。(不适用于CPU密集型计算)
多线程与多进程:
python多线程适合io操作密集型的任务(如socket server 网络并发这一类的);
python多线程不适合cpu密集操作型的任务,主要使用cpu来计算,如大量的数学计算。
那么如果有cpu密集型的任务怎么办,可以通过多进程来操作(不是多线程)。
假如CPU有8核,每核CPU都可以用1个进程,每个进程可以用1个线程来进行计算。
多进程适合在CPU 密集型操作(cpu 操作指令比较多,如科学计算,位数多的浮点运算)
多线程适合在IO 密集型操作(读写数据操作较多的,比如爬虫)
进程与线程的区别:
线程是并发,进程是并行;进程之间相互独立,是系统分配资源的最小单位,同一个进程中的所有线程共享资源。
进程:一个运行的程序或代码就是一个进程,一个没有运行的代码叫程序。
进程是系统进行资源分配的最小单位,进程拥有自己的内存空间,所以进程间数据不共享,开销大。
线程:调度执行的最小单位,也叫执行路径,不能独立存在,依赖进程的存在而存在,一个进程至少有一个线程,叫主线程,多个线程共享内存(数据共享和全局变量),因此提升程序的运行效率。
协程:用户态的轻量级线程,调度有用户控制,拥有自己的寄存器上下文和栈,切换基本没有内核切换的开销,切换灵活。
View Code
5.Lock功能,锁住某线程,使其进行完之后才进行下一个线程