python多线程

python多线程

资料:Python并行编程 中文版


join函数作用

  1. join方法的作用是阻塞主进程无法执行join以后的语句,专注执行多线程,必须等待多线程执行完毕之后才能执行主线程的语句。
  2. 多线程多join的情况下,依次执行各线程的join方法,前一个结束之后,才能执行后一个。
  3. 无参数,则等待到该线程结束,才开始执行下一个线程的join。
  4. 设置参数后,则等待该线程N秒之后不管该线程是否结束,就开始执行后面的主进程。

Python time sleep()方法
time sleep() 函数推迟调用线程的运行,可通过参数secs指秒数,表示进程挂起的时间。

time.sleep(t)

参数 t 为推迟执行的秒数。


threading方法

  1. td.active_count()返回激活的线程个数。
  2. 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
创建线程的方法非常实用,通过target参数、arg和kwarg告诉线程应该做什么。下面这个例子传递一个数字给线程(这个数字正好等于线程号码),目标函数会打印出这个数字。

python的GIL锁

GIL是CPython解释器引入的锁,GIL在解释器层面阻止了真正的并行运行。解释器在执行任何线程之前,必须等待当前正在运行的线程释放GIL。事实上,解释器会强迫想要运行的线程必须拿到GIL才能访问解释器的任何资源,例如栈或Python对象等。这也正是GIL的目的——阻止不同的线程并发访问Python对象。这样GIL可以保护解释器的内存,让垃圾回收工作正常。

因为GIL锁存在,一次只能运行一个线程计算一个东西,但由于I/O读写的时候可以开启第二个线程,所以python的多线程适合于I/O密集型任务。不适合于计算密集型任务,比如想分批处理一大批数据的情况。
python多线程
单线程与多线程的实验结果对比: 评估多线程应用的性能


Queue功能

Queue功能进行进程间的通信,将线程计算的结果存储在队列中,在主线程中进行操作。

Queue常用的方法有以下四个:

  • put(): 往queue中放一个item。
  • get(): 从queue删除一个item,并返回删除的这个item。
  • task_done(): 每次item被处理的时候需要调用这个方法。
  • join(): 所有item都被处理之前一直阻塞。
上一篇:python多线程比单线程效率低的原因及其解决办法


下一篇:Python 并行计算那点事(第1部分) -- 译文 [原创]