• 队列与线程补充,协程


    队列  (同一个进程内的队列 , 多线程)

      import queue  queue.Queue()  先进先出  queue.lifoQueue()  后进先出  queue.PriorityQueue()  优先级队列

      q = queue.PriorityQueue()

      q.put()   接收的是一个元组

      元组中的第一个参数是 : 表示当前数据的优先级

      元组中的第二个参数是 : 需要存放到队列中的数据

      优先级的比较(表示优先级的类型必须是一致的)

      如果都是int,比数值的大小,优先选出数值较小的

      如果都是str ,比较字符串的大小,(从第一个字符串的ASCAII码开始比较)优先选出ASCAII码中靠前的.

    线程池

      存放固定数量的线程,这些线程等待任务,一旦有任务,就线程自动执行任务.

      线程的最佳数量 max_workers = (os.CPU_count() or 1) * 5

    from concurrent.futures import ThreadPoolExecutor,ProcessPoolExecutor #线程异步和进程异步
    #concurrent.futures  这个模块是异步调用机制
    #from multiprocessing import Pool  这个模块既可以异步也可以同步,
    
    def func (num) :
        sum = 0
        for i in range(num) :
            sum += i**2
        print(sum)
    
    if __name__ == '__main__':
        p = ThreadPoolExecutor(10)
        for n in range(100):
            #p.submit(func , args=(n,))
            p.submit(func , n)#提交任务
        p.shutdown()#等效于进程池中的close+join  是指让父线程等待池中所有进程执行完所有任务

      

      如何把多个任务放入线程池

      for + submit 的方式提交多个任务

      map(func , iterable)方式去提交多个任务

      通过进程池线程池的效率比较

        不管是Pool 的进程池还是ProcessPoolExecutor() 的进程池,执行效率相当

        ThreadPoolExecutor 的效率要差很多

        所以当计算密集时,使用多进程.

      线程返回值

        用for + submit 方式提交多个任务,用result方法拿结果

    from concurrent.futures import ThreadPoolExecutor,ProcessPoolExecutor #线程异步和进程异步
    #concurrent.futures  这个模块是异步调用机制
    #from multiprocessing import Pool  这个模块既可以异步也可以同步,
    
    def func (num) :
        sum = 0
        for i in range(num) :
            sum += i**2
        return sum
    
    if __name__ == '__main__':
        p = ThreadPoolExecutor(10)
        re = []
        for n in range(100):
            #p.submit(func , args=(n,))
            r = p.submit(func , n)#提交任务
            re.append(r)
        #p.shutdown()#等效于进程池中的close+join  是指让父线程等待池中所有进程执行完所有任务
        [print(i.result()) for i in re ]
    #在pool 进程中那结果,用get方法 , 在ThreadPoolExecutor中拿结果使用result方法

        用map的方式提交多个任务, 返回的是生成器对象,用__next__() 方法拿结果

     

      回调函数

      线程池中的回调函数是子线程调用的,和父线程没有关系;

      进程池中的回调函数是父进程调用的,和子进程没有关系.

    协程

  • 相关阅读:
    总结Cnblogs支持的常用Markdown语法
    Python导出Excel为Lua/Json/Xml实例教程(一):初识Python
    我的博客今天开通了,请多指教!
    技术分析:Femtocell家庭基站通信截获、伪造任意短信
    数据库防火墙如何防范SQL注入行为
    Pjax.js防刷新技术
    【写给新人】做开发几年的个人经历
    WebRTC之PeerConnection的建立过程
    基于Licode demo的屏幕共享功能的实现
    基于WebRTC的MCU开源项目Licode的环境搭建
  • 原文地址:https://www.cnblogs.com/panda-pandeyong/p/9543363.html
Copyright © 2020-2023  润新知