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)#创建回调函数,和进程的创建不同
原文地址:https://www.cnblogs.com/dong-/p/9542347.html