• python 线程队列,线程池


    一. 线程队列

      引入线程队列 : import queue  #和普通队列引入方法相同

      线程队列方法 : 

        q = queue.Queue()  #实例化对列,先进先出

        q = queue.LifoQueue()  #实例化队列,后进先出  ( Last in, first out )

        q = queue.PriorityQueue()  #实例化队列,优先级队列

          优先级队列,put() 方法接收的是一个元组,第一个元素是优先级,第二个元素是数据

          优先级如果为数字,按照数字大小比较

          如果优先级是字符串或特殊字符,按照字符串或特殊字符的ASCII码比较,如果ASCII码相同,按照先进先出原则取出

    import queue
    
    # q = queue.Queue()#先进先出
    # q.put(1)
    # q.put(2)
    # q.put(3)
    # q.put(4)
    # print(q.get())
    
    # q = queue.LifoQueue()#后进先出
    # q.put(1)
    # q.put(2)
    # q.put(3)
    # q.put(4)
    # print(q.get())
    
    q = queue.PriorityQueue()#优先级队列,
    q.put((1,'11'))#优先级队列添加的参数是一个元组,元组元素为优先
    q.put((2,'22'))
    q.put((3,'33'))
    q.put((4,'44'))
    print(q.get())

    二. 线程池

      

    import time
    from concurrent.futures import ThreadPoolExecutor
    
    def func(num):
        time.sleep(0.5)
        print(num)
        return num*num  #将num*num返回给方法调用者,也就是submit,用t_r接收
    
    t = ThreadPoolExecutor(5)    #多线程最大设置数量应该为os.cpu_count()的五倍,尽量不要多
    lst = []
    for i in range(10):
        t_r = t.submit(func,i)    #提交任务,参数 :第一次参数为要执行的任务,第二个参数为给任务传的参数和进程池不同的是线程池参数传递不需要在写(args= ),直接写参数就好
        lst.append(t_r) #将任务返回的结果添加到一个列表中
    t.shutdown()    #相当于进程的close + join   等待子线程执行完再执行主线程
    print('主线程')
    [print(i.result()) for i in lst] #对列表进行循环,用result()方法取出,取出的是计算后的结果,并且顺序和for循环相同
    ################################map方法##############################

    import
    time from concurrent.futures import ThreadPoolExecutor def func(num): time.sleep(0.5) print(num) return num*num
    t
    = ThreadPoolExecutor(5) t.map(func,range(20))#拿不到返回值,拿到的是生成器. 提交多个任务,相当于for+submit() t.shutdown() print('主线程')
    ##########################回调函数############################
    将普通函数的返回值自动传给回调函数处理,线程池中的回调函数时子线程调用的

    def
    func(num): time.sleep(0.5) print(num) return num*num def call_back(n): print('回调函数 : ',n.result()) t = ThreadPoolExecutor(5) lst = [] for i in range(10): t.submit(func,i).add_done_callback(call_back)#创建回调函数,和进程的创建不同
  • 相关阅读:
    JS-鼠标经过显示二级菜单
    CSS-论css如何纯代码实现内凹圆角
    JS-制作可伸缩的水平菜单栏
    CSS-混合布局的几种方法(正确的方法和错误的原因)
    JS-选项卡制作解释部分
    JS-制作网页特效——选项卡效果(水平,点击)
    JS-DOM 综合练习-动态添加删除班级成绩表
    JS-DOM对象知识点汇总(慕课)
    JS-window对象集合
    JS-节点属性(常用!)
  • 原文地址:https://www.cnblogs.com/dong-/p/9542347.html
Copyright © 2020-2023  润新知