zoukankan      html  css  js  c++  java
  • 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)#创建回调函数,和进程的创建不同
  • 相关阅读:
    WSL2
    坐标系变换
    Python websocket
    PAJ7620 IIC 通信
    Python中assert的使用
    Python中循环的使用
    Linux 生成指定大小文件
    SVN不显示log 显示1970年问题
    阿里云 CS实例 开机自运行脚本文件
    生成UDS安全算法DLL文件
  • 原文地址:https://www.cnblogs.com/dong-/p/9542347.html
Copyright © 2011-2022 走看看