1.Python多线程、多进程

目的提高并发
1.一个应用程序,可以有多进程和多线程
2.默认:单进程,单线程
3.单进程,多线程
  IO操作,不占用CPU
  python的多线程:IO操作,多线程提供并发
计算性操作
多进程提高并发
4.GIL,全局解释器锁
总结:
多进程,多线程,提供并发
IO密集型:多线程
计算密集型:多进程

2.threading模块

threading模块对象 描述
Thread 表示一个线程的执行的对象
Lock 锁原语对象
RLock 可重入锁对象。使单线程可以再次获得已经获得了的锁(递归锁定)
Event 通用的条件变量。多个线程可以等待某个事件的发生,在事件发生后,所有的线程都会被激活
BoundedSemaphore 每次允许几个线程通过
Timer 等待多久在开始运行

3.如何创建一个线程

  1. #!/usr/bin/env python
  2. # _*_ coding:utf-8 _*_
  3. # 1.先导出threading模块
  4. import threading
  5. import time
  6.  
  7. def f1(arg):
  8. time.sleep(2)
  9. print(arg)
  10.  
  11. for i in range(10):
  12. # 2.创建一个线程对象
  13. t = threading.Thread(target=f1,args=(i,))
  14. # 创建一个线程那你想让它执行那些操作呢,就是target指定
  15. # 假设上面的f1是一个函数,那么如果函数可以传参数就用args=(参数1,参数2)
  16. t.start()
  17. # t.start()
  18. # 并不代表当前线程会被立即执行
  19. # setDaemon方法,主进程执行完就退出不在等待子进程结束
  20. # t.setDaemon(True)
  21.  
  22. # 表示主线程到此等待,直到子线程执行完毕
  23. t.join()
  24. print("end")
  25. # 默认情况下主线程不会等待子线程t.start()执行完,而是直接执行下面的print("end"),但是程序不会退出,而是等子进程执行结束后才退出程序

4.定时器Timer()

  1. #!/usr/bin/env python
  2. # _*_ coding:utf-8 _*_
  3. from threading import Timer
  4.  
  5. def func():
  6. print("hello world")
  7.  
  8. # 等1秒钟在执行func函数
  9. t = Timer(1,func)
  10. t.start()

5.消息队列queue模块

queue模块函数 描述
queue(size) 创建一个大小为size的queue对象
queue对象函数  
qsize() 返回队列的大小
empty() 如果队列为空返回True,否则返回False
full() 如果队列已满返回True,否则返回False
put(item,block=0) 把item放到队列中,如果给了block=False表示没有数据时不阻塞,直接报错
get(block=False) 在队列中取一个对象,默认block=True,如果给了block=False表示没有数据时不阻塞,直接报错

示例:

  1. 1.queue.Queue 先进先出队列
  2. 2.queue.LifoQueue,后进先出队列
  3. 3.queue.PriorityQueue,优先级队列
  4. 4.queue.deque,双向队列
  5.  
  6. 1.先进先出
  7. #!/usr/bin/env python
  8. # _*_ coding:utf-8 _*_
  9. import queue
  10.  
  11. #创建一个先进先出队列
  12. # put 存放数据,是否阻塞,是否有超时时间
  13. # put也可以传参数:
  14. # timeout=2表示如果队列满了等待2秒如果有位置就存进去,如果没有就报错
  15. # block=False 表示如果队列满了,不等待直接报错
  16. # get 取出数据,默认阻塞,队列中没有数据时阻塞等待数据
  17. # get也可以传参数:
  18. # block=False 表示不阻塞,没有数据直接报错
  19. # timeout=2 取数据时等待的超时时间
  20. #
  21. # Queue()可以接收参数Queue(10)表示最多接收10个数据
  22. # empty() 如果队列为空返回True,有数据则返回False
  23.  
  24. q = queue.Queue()
  25. # 队列中是否有数据
  26. print(q.empty())
  27. # 向队列中添加数据
  28. q.put(111)
  29. q.put(222)
  30. q.put(333)
  31. # 队列中是否有数据
  32. print(q.empty())
  33. # 查看队列中有多少数据
  34. print("当前队列中有 [%s] 个数据"%q.qsize())
  35. # 获取数据
  36. print(q.get())
  37. # 获取数据
  38. print(q.get())
  39. # 取出两个在查看
  40. print("当前队列中有 [%s] 个数据"%q.qsize())
  41.  
  42. 2.后进先出队列
  43. #!/usr/bin/env python
  44. # _*_ coding:utf-8 _*_
  45. import queue
  46.  
  47. q = queue.LifoQueue()
  48.  
  49. q.put(123)
  50. q.put(456)
  51.  
  52. print(q.get())
  53.  
  54. 3.双向队列
  55. #!/usr/bin/env python
  56. # _*_ coding:utf-8 _*_
  57. import queue
  58.  
  59. q = queue.deque()
  60. # 写入数据
  61. q.append(")
  62. q.append(")
  63. # 在左边插入输入
  64. q.appendleft(")
  65. # 获取数据
  66. print(q.pop())
  67. # 获取最左边的数据
  68. print(q.popleft())
  69.  
  70. 4.优先级队列
  71. #!/usr/bin/env python
  72. # _*_ coding:utf-8 _*_
  73. import queue
  74.  
  75. q = queue.PriorityQueue()
  76. # 优先级队列写入数据需要传两个值,第一个值是优先级数字越小优先级越高,第二个参数是数据
  77. q.put((1,"test1"))
  78. q.put((2,"test2"))
  79. q.put((0,"test0"))
  80.  
  81. print(q.get())

生产者消费者模型(队列)

6.自定义线程池

  1. #!/usr/bin/env python
  2. # _*_ coding:utf-8 _*_
  3. import queue
  4. import threading
  5. import time
  6.  
  7. class Threadpool:
  8. """
  9. 自定义线程池
  10. """
  11. def __init__(self,maxsize=5):
  12. """
  13. 初始化
  14. :param maxsize: 队列存放数据的个数
  15. """
  16. self.maxsize = maxsize
  17. # 创建一个队列
  18. self._q = queue.Queue(maxsize)
  19. # maxsize多大就创建一个线程对象
  20. for i in range(maxsize):
  21. self._q.put(threading.Thread)
  22.  
  23. def get_thread(self):
  24. """
  25. 获取一个线程对象
  26. 等同于创建了一线线程对象t = threading.Thread
  27. :return:
  28. """
  29. return self._q.get()
  30.  
  31. def add_thread(self):
  32. """
  33. 添加一个线程对象到队列中
  34. :return:
  35. """
  36. self._q.put(threading.Thread)
  37.  
  38. pool = Threadpool(5)
  39.  
  40. def task(arg,p):
  41. """
  42. 任务
  43. :param arg:
  44. :param p: p 等于接收pool对象
  45. :return:
  46. """
  47. print(arg)
  48. time.sleep(1)
  49. # 队列中减少一个线程对象就在添加一个进去,保证队列中始终是5个
  50. p.add_thread()
  51.  
  52. for i in range(100):
  53. t = pool.get_thread()
  54. obj = t(target=task, args=(i,pool))
  55. obj.start()

Python进阶【第二篇】多线程、消息队列queue的更多相关文章

  1. python消息队列Queue

    实例1:消息队列Queue,不要将文件命名为"queue.py",否则会报异常"ImportError: cannot import name 'Queue'" ...

  2. 消息队列Queue大全

    消息队列Queue大全 (http://queues.io/) 作业队列,消息队列和其他队列.几乎所有你能想到的都在这. 关于 那里有很多排队系统.他们每个人都不同,是为解决某些问题而创建的.这个页面 ...

  3. 消息队列queue

    一.queue 在多线程编程中,程序的解耦往往是一个麻烦的问题,以及在socket网络编程中也会有这样的问题.recv 和send之间,如果服务端有消息,问题需要发送给客户端,而那边的recv 被主程 ...

  4. Python人工智能第二篇:人脸检测和图像识别

    Python人工智能第二篇:人脸检测和图像识别 人脸检测 详细内容请看技术文档:https://ai.baidu.com/docs#/Face-Python-SDK/top from aip impo ...

  5. python【第十一篇】消息队列RabbitMQ、缓存数据库Redis

    大纲 1.RabbitMQ 2.Redis 1.RabbitMQ消息队列 1.1 RabbitMQ简介 AMQP,即Advanced Message Queuing Protocol,高级消息队列协议 ...

  6. python多进程之间的通信:消息队列Queue

    python中进程的通信:消息队列. 我们知道进程是互相独立的,各自运行在自己独立的内存空间. 所以进程之间不共享任何变量. 我们要想进程之间互相通信,传送一些东西怎么办? 需要用到消息队列!! 进程 ...

  7. python学习笔记——multiprocessing 多进程组件-队列Queue

    1 消息队列 1.1 基本语法 消息队列:multiprocessing.Queue,Queue是对进程安全的队列,可以使用Queue实现对进程之间的数据传输:还有一个重要作用是作为缓存使用. Que ...

  8. python基本数据结构栈stack和队列queue

    1,栈,后进先出,多用于反转 Python里面实现栈,就是把list包装成一个类,再添加一些方法作为栈的基本操作. 栈的实现: class Stack(object): #初始化栈为空列表 def _ ...

  9. python 3.x 学习笔记16 (队列queue 以及 multiprocessing模块)

    1.队列(queue) 用法: import queue q = queue.Queue() #先进先出模式 q.put(1) #存放数据在q里 作用: 1)解耦    2)提高效率 class qu ...

随机推荐

  1. Easyui datagrid editor为combobox时指定数据源

    当在datagrid行内部应用添加编辑操作时,引入combobox是非常方便的操作,我在引入combobox时对数据源这快做个总结,在做demo的过程中遇到个问题,就是当你选择了下拉框的值后点击保存, ...

  2. Fragment基础----创建

    1,Fragment的目的及应用场景 fragment 是3.0后引入的类,其字面翻译为“碎片”. 目的是将activity划分成许多单元再进行组合,可以根据不同分辨率屏幕,在不同状态下,灵活创建优化 ...

  3. Eclipse与Android源码中ProGuard工具的使用

    由于工作需要,这两天和同事在研究android下面的ProGuard工具的使用,通过查看android官网对该工具的介绍以及网络上其它相关资料,再加上自己的亲手实践,算是有了一个基本了解.下面将自己的 ...

  4. HTML基本元素(二)

    1.图像 <img src="URL" alt="" /> 说明 src 定义图像的url alt 定义图像的替代文本 width 设置图像的宽度 ...

  5. Sql Server函数全解(五)之系统函数

     系统信息包括当前使用的数据库名称,主机名,系统错误消息以及用户名称等内容.使用SQL SERVER中的系统函数可以在需要的时候获取这些信息.下面介绍系统函数的作用和使用方法. 1.返回表中指定字段的 ...

  6. CSS3和jQuery实现的自定义美化Checkbox

    效果图: 是不是比默认的好看多了,个人的审美观应该还是可以的. 当然我们可以在这里查看DEMO演示. 接下来我们一起来看看实现这款美化版Checkbox的源代码.主要思路是利用隐藏原来的checkbo ...

  7. C++中关于[]静态数组和new分配的动态数组的区别分析

    这篇文章主要介绍了C++中关于[]静态数组和new分配的动态数组的区别分析,很重要的概念,需要的朋友可以参考下 本文以实例分析了C++语言中关于[]静态数组和new分配的动态数组的区别,可以帮助大家加 ...

  8. 分布式系统设计权衡之CAP

    写在最前: 1.为什么学习并记录分布式设计理念一系列相关的东西 在日常工作中系统设计评审的时候,经常会有一些同事抛出一些概念,高可用性,一致性等等字眼,他们用这些最基本的概念去反驳系统最初的设计,但是 ...

  9. [注意]SerialPort操作PCI-1621D多串口卡,出现异常"参数不正确"

    开发LED大屏显示.40-20mA模拟量输出的时候,经常要与串口打交道.但是Windows自带的SerialPort串口操作组件貌似兼容性 不是太好,或是SerialPort本身有BUG,在操作PCI ...

  10. Java基础学习总结 -- 图形用户界面GUI

    虽然目前Java算不上前端开发的主力,但是作为Java入门基础的一部分,学习Java的GUI编程还是有必要的,而且可以做出一些小且有趣的图形程序来提高学习热情.本篇学习总结均为一个Beginner的笔 ...