1.Python多线程、多进程

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

2.threading模块

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

3.如何创建一个线程

#!/usr/bin/env python
# _*_ coding:utf-8 _*_
# 1.先导出threading模块
import threading
import time

def f1(arg):
    time.sleep(2)
    print(arg)

for i in range(10):
    # 2.创建一个线程对象
    t = threading.Thread(target=f1,args=(i,))
    # 创建一个线程那你想让它执行那些操作呢,就是target指定
    # 假设上面的f1是一个函数,那么如果函数可以传参数就用args=(参数1,参数2)
    t.start()
    # t.start()
    # 并不代表当前线程会被立即执行
    # setDaemon方法,主进程执行完就退出不在等待子进程结束
    # t.setDaemon(True)

# 表示主线程到此等待,直到子线程执行完毕
t.join()
print("end")
# 默认情况下主线程不会等待子线程t.start()执行完,而是直接执行下面的print("end"),但是程序不会退出,而是等子进程执行结束后才退出程序

4.定时器Timer()

#!/usr/bin/env python
# _*_ coding:utf-8 _*_
from threading import Timer

def func():
    print("hello world")

# 等1秒钟在执行func函数
t = Timer(1,func)
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.queue.Queue 先进先出队列
 2.queue.LifoQueue,后进先出队列
 3.queue.PriorityQueue,优先级队列
 4.queue.deque,双向队列

     1.先进先出
         #!/usr/bin/env python
         # _*_ coding:utf-8 _*_
         import queue

         #创建一个先进先出队列
         # put 存放数据,是否阻塞,是否有超时时间
         # put也可以传参数:
         #   timeout=2表示如果队列满了等待2秒如果有位置就存进去,如果没有就报错
         #   block=False 表示如果队列满了,不等待直接报错
         # get 取出数据,默认阻塞,队列中没有数据时阻塞等待数据
         # get也可以传参数:
         #   block=False 表示不阻塞,没有数据直接报错
         #   timeout=2   取数据时等待的超时时间
         #
         # Queue()可以接收参数Queue(10)表示最多接收10个数据
         # empty()   如果队列为空返回True,有数据则返回False

         q = queue.Queue()
         # 队列中是否有数据
         print(q.empty())
         # 向队列中添加数据
         q.put(111)
         q.put(222)
         q.put(333)
         # 队列中是否有数据
         print(q.empty())
         # 查看队列中有多少数据
         print("当前队列中有 [%s] 个数据"%q.qsize())
         # 获取数据
         print(q.get())
         # 获取数据
         print(q.get())
         # 取出两个在查看
         print("当前队列中有 [%s] 个数据"%q.qsize())

     2.后进先出队列
         #!/usr/bin/env python
         # _*_ coding:utf-8 _*_
         import queue

         q = queue.LifoQueue()

         q.put(123)
         q.put(456)

         print(q.get())

     3.双向队列
         #!/usr/bin/env python
         # _*_ coding:utf-8 _*_
         import queue

         q = queue.deque()
         # 写入数据
         q.append(")
         q.append(")
         # 在左边插入输入
         q.appendleft(")
         # 获取数据
         print(q.pop())
         # 获取最左边的数据
         print(q.popleft())

     4.优先级队列
         #!/usr/bin/env python
         # _*_ coding:utf-8 _*_
         import queue

         q = queue.PriorityQueue()
         # 优先级队列写入数据需要传两个值,第一个值是优先级数字越小优先级越高,第二个参数是数据
         q.put((1,"test1"))
         q.put((2,"test2"))
         q.put((0,"test0"))

         print(q.get())

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

6.自定义线程池

#!/usr/bin/env python
# _*_ coding:utf-8 _*_
import queue
import threading
import time

class Threadpool:
    """
    自定义线程池
    """
    def __init__(self,maxsize=5):
        """
        初始化
        :param maxsize: 队列存放数据的个数
        """
        self.maxsize = maxsize
        # 创建一个队列
        self._q = queue.Queue(maxsize)
        # maxsize多大就创建一个线程对象
        for i in range(maxsize):
            self._q.put(threading.Thread)

    def get_thread(self):
        """
        获取一个线程对象
        等同于创建了一线线程对象t = threading.Thread
        :return:
        """
        return self._q.get()

    def add_thread(self):
        """
        添加一个线程对象到队列中
        :return:
        """
        self._q.put(threading.Thread)

pool = Threadpool(5)

def task(arg,p):
    """
    任务
    :param arg:
    :param p: p 等于接收pool对象
    :return:
    """
    print(arg)
    time.sleep(1)
    # 队列中减少一个线程对象就在添加一个进去,保证队列中始终是5个
    p.add_thread()

for i in range(100):
    t = pool.get_thread()
    obj = t(target=task, args=(i,pool))
    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. 【JUC】JDK1.8源码分析之ReentrantLock(三)

    一.前言 在分析了AbstractQueuedSynchronier源码后,接着分析ReentrantLock源码,其实在AbstractQueuedSynchronizer的分析中,已经提到过Ree ...

  2. JDBC连接SQL Server代码模板

    *                  JDBC连接SQL Server数据库 代码模板* Connection: 连接数据库并担任传送数据的任务:* Statement :  执行SQL语句:* Re ...

  3. BizTalk动手实验(十七)ODBC适配器使用

    更多内容请查看:BizTalk动手实验系列目录                       BizTalk 开发系列 1 课程简介 通过本课程熟悉ODBC适配器的的使用,本练习采用BizTalk 20 ...

  4. Objective-C 对象(内容根据iOS编程编写)

    开发iOS程序需要使用 Objective-C 语言和Cocoa Touch框架.Objective-C 源于 C 语言,是 C 语言的扩展. Cocoa Touch框架是一个Objective-C类 ...

  5. Rafy 中的 Linq 查询支持(根据聚合子条件查询聚合父)

    为了提高开发者的易用性,Rafy 领域实体框架在很早开始就已经支持使用 Linq 语法来查询实体了.但是只支持了一些简单的.常用的条件查询,支持的力度很有限.特别是遇到对聚合对象的查询时,就不能再使用 ...

  6. VS 常用快捷键

    区域代码选择:按Shift选择整(行)块代码,可配合四个方向键(左右键:选择单个字符,上下键:上下行的当前列).Home(当前行首).End(当前行尾).PgUp(当前页首)和PgDn(当前页尾)使用 ...

  7. .net中xml文件的导入使用(包括创建xml和导入xml)

    上次有说到.net 创建xml文件的方法(一种固定方式,一种动态方法),这次记录一下怎样导入xml文件 1.导入xml文件的方法 1)xml文件格式

  8. 怎么用SAX生成xml文件

    public void createXML() throws Exception{ Book b1 = new Book(); b1.setId("1"); b1.setName( ...

  9. 利用SCORE法则来总结一次偷懒的单元测试过程

    最近遇到一个单元测试的问题,本周正好学个了一个SCORE法则,这里正好练练手应用此法则将问题的前因后果分享给大家. S:背景  代码要有单元测试,检测的标准就是统计代码的单元测试覆盖率,程序员需要达到 ...

  10. HTML5有特色的进度条

    查看效果:http://keleyi.com/keleyi/phtml/html5/26.htm 完整代码如下: <!DOCTYPE html> <html> <head ...