python多线程
join函数作用:
- join方法的作用是阻塞主进程无法执行join以后的语句,专注执行多线程,必须等待多线程执行完毕之后才能执行主线程的语句。
- 多线程多join的情况下,依次执行各线程的join方法,前一个结束之后,才能执行后一个。
- 无参数,则等待到该线程结束,才开始执行下一个线程的join。
- 设置参数后,则等待该线程N秒之后不管该线程是否结束,就开始执行后面的主进程。
Python time sleep()方法
time sleep() 函数推迟调用线程的运行,可通过参数secs指秒数,表示进程挂起的时间。
time.sleep(t)
参数 t 为推迟执行的秒数。
threading方法
-
td.active_count()
返回激活的线程个数。 -
td.current_thread()
返回此刻运行的线程名。
通过threading的Thread类来声明一个线程对象。
class threading.Thread(group=None, target=None, name=None, args=(), kwargs={})
上面的代码中:
-
group
: 一般设置为None
,这是为以后的一些特性预留的 -
target
: 当线程启动的时候要执行的函数 -
name
: 线程的名字,默认会分配一个唯一名字Thread-N
-
args
: 传递给target
的参数,要使用tuple类型 -
kwargs
: 同上,使用字典类型dict
python的GIL锁
GIL是CPython解释器引入的锁,GIL在解释器层面阻止了真正的并行运行。解释器在执行任何线程之前,必须等待当前正在运行的线程释放GIL。事实上,解释器会强迫想要运行的线程必须拿到GIL才能访问解释器的任何资源,例如栈或Python对象等。这也正是GIL的目的——阻止不同的线程并发访问Python对象。这样GIL可以保护解释器的内存,让垃圾回收工作正常。
因为GIL锁存在,一次只能运行一个线程计算一个东西,但由于I/O读写的时候可以开启第二个线程,所以python的多线程适合于I/O密集型任务。不适合于计算密集型任务,比如想分批处理一大批数据的情况。
单线程与多线程的实验结果对比: 评估多线程应用的性能
Queue功能
Queue功能进行进程间的通信,将线程计算的结果存储在队列中,在主线程中进行操作。
Queue常用的方法有以下四个:
- put(): 往queue中放一个item。
- get(): 从queue删除一个item,并返回删除的这个item。
- task_done(): 每次item被处理的时候需要调用这个方法。
- join(): 所有item都被处理之前一直阻塞。