python中的多线程就是在一个进程中存在着多个线程,在线程中,所有的线程都是共享资源的,线程之间的数据通信很简单。但是python仅支持一个线程的运行,因为python中存在一个全局解释器锁GIL(global interpreter lock),正是这个锁能保证同一时刻只有一个线程在运行,所以多线程依旧像是单线程的运行。
GIL无疑就是一把对多线程有影响的全局锁,解决它对多线程的影响,不单单是释放GIL这么简单。GIL使得对象模型都是可以并发访问。GIL全局解释器锁解决多线程之间数据完整性和状态同步的问题,但是这个锁在同一时刻只有一个线程在运行,所以在多核的情况下也只能发挥出单核的性能,多线程依旧像是单线程的运行。下面用一个单线程和多线程对比实例给大家看一下结果。
执行结果:
total time of single is: 0.04100227355957031
total time of multi is: 0.019001245498657227
python多线程编程是为了并行运行相互独立的子任务,大幅度提高整个任务的效率,比如异步任务、运算密集型任务等。线程有开始,顺序执行和结束三个阶段。python多线程编程中常用方法有:start()方法、run()方法、join()方法、isAlive()方法、getName()方法、setName()方法、isDaemon()方法、setDaemon()方法等。
在python多线程模块主要有thread和threading,推荐大家使用threading模块,因为threading进行了大量的封装,从而不需要管理子线程和主线程之间的问题,也允许用户自己创建和管理线程。
多任务可以由多进程完成,也可以由一个进程内的多线程完成。多线程中任务有以下特点:异步的,多个并发事务,各个事务的运行顺序是不确定的、随机的、不可预测的。所以多线程编程模型复杂,容易发生冲突,必须用锁加以隔离,同时,又要小心死锁的发生。
其实python的多线程其实并不是真正的多线程,因为GIL(global interpreter lock)全局解释器锁的存在,导致python中大部分情况需要使用multiprocessing,多进程完成从单进程到并发执行的转换。
Python的多进程包multiprocessing支持子进程、通信和共享数据、执行不同形式的同步。在multiprocessing中,一个程序的执行实例就是一个进程,每一个进程都用一个Process类来表示,每一个进程提供执行程序所需的所有资源。同一个进程中的线程共享同一内存空间,但是进程之间是独立的。同一个进程中的所有线程的数据是共享的(进程通讯),进程之间的数据是独立的。