zoukankan      html  css  js  c++  java
  • python多线程的实现方法总结


    - 本篇文章介绍支持python多线程编程的模块及其使用方法,主要有thread,threading,Queue,multiprocessing等 - 关于多线程编程的适用环境以及和多进程编程的区别,可查看[https://www.cnblogs.com/liushi-Oscar/p/9636051.html](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](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类
    	- 待更新
  • 相关阅读:
    Hadoop OutputFormat浅析
    硬盘性能
    HDFS读文件过程分析:读取文件的Block数据
    HDFS写文件过程分析
    JAVA中的编码分析
    HBase 写入优化
    HBase ttl 验证
    大数据多维分析平台的实践
    TiDB在特来电的探索
    Druid 基础使用-操作篇(Pivot、plyql)
  • 原文地址:https://www.cnblogs.com/liushi-Oscar/p/9639768.html
Copyright © 2011-2022 走看看