python多线程的实现方法总结


  • 本篇文章介绍支持python多线程编程的模块及其使用方法,主要有thread,threading,Queue,multiprocessing等
  • 关于多线程编程的适用环境以及和多进程编程的区别,可查看https://www.cnblogs.com/liushi-Oscar/p/9636051.html

thread 模块

  • thread模块在官方的介绍中并不推荐使用,原因在于thread模块对进程的退出没有控制,只有较少的同步原语等,因此这里不花太多时间介绍了
  • 其包含的功能可以使用更高级的threading模块实现

threading 模块

  • Thread 类
    • 多线程的实现主要用Thread类来执行,该类包含多种常用的方法
      • __init__(target=None,args=(),kwargs={},group=None,name=None,daemon=None)
        • 实现一个线程的实例,前两个参数常用,后几个参数很少用到
      • start()
        • 开始执行这个线程
      • join(timeout=None)
        • 设置该线程最长执行时间。
        • 如果线程执行完成,正常退出并且返回
        • 如果线程处于挂起状态(阻塞),则最多阻塞timeout时长(单位s),如未设置,则一直处于阻塞中
      • is_alive()
        • 该线程是否还存活,是,返回True,否返回False
      • 简单示例:
        •   theads = []
          for i in range(count):
          t = threading.Thread(target=loop,args=(i,)) #loop为线程执行的函数名
          theads.append(t)
          for thead in theads:
          thead.start()
          for thead in theads:
          thead.join()

Queue 模块

  • Queue是什么?能干什么?怎么实现?
    • 是一个提供线程间的通信机制的模块
    • 让线程之间可以分享数据
    • 创建一个队列,让生产者(线程)在其中放入新的商品(数据),而消费者(线程)消费这些商品(数据)
  • Queue模块属性
    • Queue(maxsize=0)
      • 创建一个先入先出的队列
      • 如给定maxsize,则在队列没有空间时阻塞;否则,为无限队列
    • LifoQueue(maxsize=0)
      • 创建一个后入先出的队列
    • PriorityQueue(maxsize=0)
      • 创建一个优先级队列
    • Queue队列异常
      • Empty
        • 当队列为空时,仍用get()方法时,抛出Empty异常
      • Full
        • 当队列已满时,仍用pull()方法时,抛出Full异常
    • Queue实例方法
      • qsize()
        • 返回队列大小
      • empty()
        • 返回队列是否为空。是True,否False
      • full()
        • 返回队列是否已满。是True,否False
      • put(item,block=True,timeout=None)
        • 将item放入队列
        • block为True,在队列已满时阻塞;False,空间已满时抛出Full异常
        • timeout,如果阻塞,则最多阻塞时长
      • get(block=True, timeout=None)
        • 取出队列数据
      • task_done()
      • join()

multiprocessing 模块

  • multiprocessing主要为多进程处理模块,与多线程的区别可参考https://www.cnblogs.com/liushi-Oscar/p/9636051.html
  • 多线程适合I/O密集型,多进程更适合计算密集型

  • Process类
    • Process的使用方法和threading.Thread类基本相同,前者实现多进程。主要方法简写如下:
      • Process([target [, name [, args [, kwargs]]]])
        • target: 要执行的方法;
        • name: 进程名;
        • args/kwargs: 要传入方法的参数。
      • 实例方法:
        • is_alive():返回进程是否在运行。
        • join([timeout]):阻塞当前上下文环境的进程程,直到调用此方法的进程终止或到达指定的timeout(可选参数)。
        • start():进程准备就绪,等待CPU调度。
        • run():strat()调用run方法,如果实例进程时未制定传入target,这star执行t默认run()方法。
        • terminate():不管任务是否完成,立即停止工作进程。
      • 属性:
        • daemon:和线程的setDeamon功能一样(将父进程设置为守护进程,当父进程结束时,子进程也结束)。
        • exitcode(进程在运行时为None、如果为–N,表示被信号N结束)。
        • name:进程名字。
        • pid:进程号。
  • Queue类
    • 和上述Queue模块使用方法基本类似
    • 只适用于Process类
  • Pool类
    • 待更新

猜你喜欢

转载自www.cnblogs.com/liushi-Oscar/p/9639768.html