python全栈开发 * 线程队列 线程池 协程 * 180731

一.线程队列

队列:1.Queue    先进先出    自带锁  数据安全     from queue import Queue       from multiprocessing import Queue    (IPC队列)2.LifoQueue后进先出    后进先出    自带锁  数据安全
from queue import LifoQueue
    lq=LifoQueue(5)
    lq.put(123)
    lq.put(666)
    lq.put(888)
    lq.put(999)
    lq.put("love")
    print(lq.put_nowait("miss"))   #报错 queue.Full
    print(lq)    #  <queue.LifoQueue object at 0x0000017901BC8C88>
    print(lq.get())   #love
    print(lq.get())   #999
    print(lq.get())   #888
    print(lq.get())   #666
    print(lq.get())   #123
    #print(lq.get_nowait())     #报错 queue.Empty
3.PriorityQueue优先级队列    (放元组,数字从小到大,英文字母按ASCII码先后顺序)
from queue import PriorityQueue
    pq=PriorityQueue(4)
    pq.put((10,"aaa"))
    pq.put((5,"S"))
    pq.put((5,"ccc"))
    pq.put((10,"zzz"))

    #pq.put_nowait((10,"bbb"))      #报错queue.Full
    print(pq)       #  <queue.PriorityQueue object at 0x000001D6FEF38C50> print(pq.get())
    print(pq.get())   #(5, ‘ccc‘)
    print(pq.get())   #(10, ‘aaa‘)
    print(pq.get())   #(10, ‘zzz‘)
    print(pq.get())   #(20, ‘bbb‘)
    # print(pq.get_nowait())     # 报错queue.Empty
二 线程池
Multiprocessing模块 自带进程池PoolThreading 模块 没有Pool(没有线程池)concurrent.futures帮助你管理线程池和进程池    高度封装    进程池/线程池的统一的统一的使用方法
import time
    from threading import currentThread
    from concurrent.futures import ProcessPoolExecutor
    from concurrent.futures import ThreadPoolExecutor
    def func(i):
        time.sleep(1)
        print("in %s %s"%(i,currentThread()))
        return i**2
    def back(fn):
        print(fn.result(),currentThread())

    t=ThreadPoolExecutor(5)
    ret_l=[]
    for i in range(20):
        ret=t.submit(func,i).add_done_callback(back)
        # ret_l.append(ret)
    t.shutdown(wait=True)    #括号里可以省略
    # for ret in ret_l:
    #     print(ret.result())
    print(666)
 ThreadPoolExecutor的相关方法:    1.t.map方法   启动多线程任务    # t.map(func,range(20))  替代for  submit    2.t.submit(func,*args,**kwargs)  异步提交任务    3.t.shutdown (wait=True)  相当于进程池的pool.close()+pool.join()操作  同步控制        wait=True,等待池内所有任务执行完毕回收完资源后才继续        wait=False,立即返回,并不会等待池内的任务执行完毕        submit和map必须在shutdown之前    4.result获取结果    ret.result()    5.回调函数 add_done_callback(back)        在回调函数内接收的参数是一个对象,需要通过result来获取返回值        在主进程中执行三.协程
进程:资源分配的最小单位线程 :CPU调度的最小单位协程: 能在一条线程的基础上,在多个任务之间互相切换    节省线程开启的消耗    从python代码的级别调度        正常的线程是CPU调度的最小单位        协程的调度并不是由操作系统来完成的.(一).yield的机制就是协程
 def func():
        print(1)
        x=yield "aaa"
        print(x)
        yield "bbb"
    g=func()
    print(next(g))
    print(g.send("***"))
(二).在多个函数之间互相切换的功能--协程
 def consumer():
        while True:
            x=yield
            print(x)

    def producer():
        g=consumer()
        next(g)

        for i in range(10):
            g.send(i)
    producer()
yeild 只有程序之间的切换,没有重利用任何IO操作的时间greenlet(第三方模块) 程序上下文切换cmd : pip3  install  模块名  安装第三方模块(三).greenlet    协程模块  单纯的程序切换耗费时间
 import time
    from greenlet import greenlet
    def eat():
        print(‘吃‘)
        time.sleep(1)
        g2.switch()
        print("吃完了")
        time.sleep(1)
        g2.switch()

    def play():
        print("玩")
        time.sleep(1)
        g1.switch()
        print("玩美了")

    g1=greenlet(eat)
    g2=greenlet(play)
    g1.switch()
(四).gevent    遇到IO就切换  使用协程减少IO操作带来的时间消耗    greenlet 是gevent的底层    gevent是基于greenlet实现的    python代码在控制程序的切换第一版:
import time
    import gevent
    from gevent import monkey
    def eat():
        print("吃")
        gevent.sleep(2)
        print("吃完了")
    def play():
        print("玩")
        gevent.sleep(2)
        print("玩美了")

    g1=gevent.spawn(eat)
    g2=gevent.spawn(play)
    g1.join()    #等待g1结束
    g2.join()    #等待g2结束
第二版要用gevent,需要将from gevent import monkey;monkey.patch_all()放到文件的开头
from gevent import monkey;monkey.patch_all()
    import time
    import gevent

    def eat(name):
        print("吃")
        time.sleep(2)
        print("%s吃完了"%name)

    def play():
        print("玩")
        time.sleep(2)
        print("玩美了")

    g1=gevent.spawn(eat,"alex")   #括号里传参第一个是函数名,后面可以跟多个参数可以是位置参数,也可以是关键字参数,都是传给eat的
    g2=gevent.spawn(play)
    gevent.joinall([g1,g2])#  g1.join()和g2.join()合并成一个.
    print(g1.value)         #None
四.协程起socket(tcp)服务器代码
from gevent import monkey;monkey.patch_all()
import socket
import gevent
def talk(conn):
    while True:
        conn.send(b‘hallo‘)
        print(conn.recv(1024))
sk=socket.socket()
sk.bind(("127.0.0.1",9902))
sk.listen()
while True:
    conn,addr=sk.accept()
    gevent.spawn(talk,conn)
客户端代码
import socket
from threading import Thread
def client():
    sk=socket.socket()
    sk.connect(("127.0.0.1",9902))
    while True:
        print(sk.recv(1024))
        sk.send(b‘hi‘)
for i in range(5):
    Thread(target=client).start()



原文地址:https://www.cnblogs.com/J-7-H-2-F-7/p/9398394.html

时间: 2024-10-10 21:30:13

python全栈开发 * 线程队列 线程池 协程 * 180731的相关文章

python全栈开发,Day41(线程概念,线程的特点,进程和线程的关系,线程和python理论知识,线程的创建)

昨日内容回顾 队列 队列:先进先出.数据进程安全 队列实现方式:管道+锁 生产者消费者模型:解决数据供需不平衡 管道 双向通信,数据进程不安全 EOFError: 管道是由操作系统进行引用计数的 必须在所有进程中关闭管道后才能生成EOFError异常 数据共享(不常用) Manager list dict 数据进程不安全的 进程池 存放进程的容器 在进程创建之初,创建固定个数的进程 会被多个任务循环利用 节省了进程创建和销毁的时间开销 降低了操作系统调度进程的压力 信号量和进程池的区别 信号量:

Python全栈 项目(电子词典、协程、pdb调试)

后面我就不截图了 大家还是看原文吧                          https://yq.aliyun.com/articles/629534 . .......................................................................................................................................................................

Python全栈【进程、线程】

Python全栈[进程.线程] 本节内容: 进程 线程 协程 I/O多路复用 进程 线程

python全栈开发目录

python全栈开发目录 linux命令 初识python python基础数据类型 函数编程.set.深浅拷贝 内置函数 文件操作 装饰器 迭代器和生成器 常用模块 初识类和对象 类和对象(进阶) 反射 异常处理 socket.IO多路复用 线程.进程.协程 HTML CSS JavaScript DOM文档操作 jQuery实例 web框架本质 Tornado mysql基础 mysql进阶 ..... 基本算法 递归--二分法查找 冒泡排序 更多 线程池

Python 全栈开发【第一篇】:目录

Python 全栈开发[第0篇]:目录 第一阶段:Python 开发入门 Python 全栈开发[第一篇]:计算机原理&Linux系统入门 Python 全栈开发[第二篇]:Python基础语法入门 Python 全栈开发[第三篇]:数据类型.字符编码.文件操作 第二阶段:函数编程&常用标准库 Python 全栈开发[第四篇]:函数.递归.生成器.迭代器 Pyhton 全栈开发[第五篇]:常用模块学习 第三阶段:面向对象编程&网络编程基础 Python 全栈开发[第六篇]:面向对象

Python全栈开发【基础三】

Python全栈开发[基础三]  本节内容: 函数(全局与局部变量) 递归 函数 一.定义和使用 函数最重要的是减少代码的重用性和增强代码可读性 1 def 函数名(参数): 2 3 ... 4 函数体 5 ... 6 返回值 函数的定义主要有如下要点: def:表示函数的关键字 函数名:函数的名称,日后根据函数名调用函数 函数体:函数中进行一系列的逻辑计算 参数:为函数体提供数据 返回值:当函数执行完毕后,可以给调用者返回数据. 总结使用函数的好处: 1.减少代码重用 2.保持一致性,易维护

Python全栈开发【第一篇】:初识Python

Python全栈开发[第一篇] 本节内容: Python 的种类 Python 的环境 Python 入门(解释器.编码.变量.input输入.if流程控制与缩进.while循环) if流程控制与while循环练习题 基本数据类型前引 Python 的种类 Cpython Python的官方版本,使用C语言实现,使用最为广泛,CPython实现会将源文件(py文件)转换成字节码文件(pyc文件),然后运行在Python虚拟机上. Jyhton Python的Java实现,Jython会将Pyth

Python全栈开发

Python全栈开发 一文让你彻底明白Python装饰器原理,从此面试工作再也不怕了. 一.装饰器 装饰器可以使函数执行前和执行后分别执行其他的附加功能,这种在代码运行期间动态增加功能的方式,称之为“装饰器”(Decorator),装饰器的功能非常强大,但是理解起来有些困难,因此我尽量用最简单的例子一步步的说明这个原理. 1.不带参数的装饰器 假设我定义了一个函数f,想要在不改变原来函数定义的情况下,在函数运行前打印出start,函数运行后打印出end,要实现这样一个功能该怎么实现?看下面如何用

Python全栈开发【基础二】

Python全栈开发[基础二] 本节内容: Python 运算符(算术运算.比较运算.赋值运算.逻辑运算.成员运算) 基本数据类型(数字.布尔值.字符串.列表.元组.字典) 编码与进制转换 Python 运算符 1.算术运算: 2.比较运算: 3.赋值运算: 4.逻辑运算:  5.成员运算: 基本数据类型 1.数字 int(整型) 1 class int(object): 2 """ 3 int(x=0) -> integer 4 int(x, base=10) -&g

Python全栈开发【基础四】

Python全栈开发[基础四] 本节内容: 匿名函数(lambda) 函数式编程(map,filter,reduce) 文件处理 匿名函数 lambda表达式:对于简单的函数,存在一种简便的表示方式,即lambda表达式 1 #这段代码 2 def calc(n): 3 return n**n 4 print(calc(10)) 5 6 #换成匿名函数 7 calc = lambda n:n**n 8 print(calc(10)) 匿名函数主要是和其它函数搭配使用 举例: 1 ########