1,队列的三种形态:是用于同一进程的队列,不能做多进程的通信
1.1>普通的队列,(先进先出)有2中操作方式:put()向队列里放数据,get()向队列里取数据(一次只能取1个)
import queue q = queue.Queue()...................实力化一个队列的对象 q.put(1)......................向对列里放int的数据 q.put(2) q.put(3) print(q.get())...............从对列里取数据 print(q.get()) print(q.get())
如果想一次把队列里的东西全部取出来,就用放循环,range(q.qsize())就可以了
一次get()就只能拿一个数据.当get()大于put()的时候,数据会处于阻塞状态
1.2>后进先出的队列(LifoQueue)这个实例化的对象,同理一个put(),一个get()
import queue q = queue.LifoQueue().................实例化一个LifoQueue的对象 q.put(1).................................向队列里放数据 q.put(2) q.put(3) print(q.get())..........................向队列里取数据 print(q.get()) print(q.get())
一次get()就只能从队列里拿一个数据,同理当get()>put()时,就会出于阻塞状态
1.3>优先级队列(取值的时候就会先取优先级高的数据)
import queue q = queue.PriorityQueue()..........................实例化一个优先级的对象 q.put((1,"laozheng")).......................往队列里放数据 q.put((2,"laowu")) q.put((3,"laosun")) print(q.get())..................向队列里取数据 print(q.get())
优先级队列,put()方法接收的是一个元组(),第一个位置是优先级,第二个位置是数据
优先级如果是数字,直接比较数值
如果是字符串,是按照ASCII码比较,当ASCII码相同的时候,会按照先进先出的原则
2,条件的那点事
Condition包括4个方法
acquire(),release(),wait(),notify(int)
同样notify(int)会给wait()一个标识在阻塞在这可以去开启几个子线程
from threading import Thread,Condition import time def func(con,i): con.acquire().....主线程和100个子线程都在抢夺递归锁的一把钥匙,如果子线程抢到了,执行主线程代码,然后notify发信号,还钥匙,但是, con.wait().........此时如果主线程执行特别快,极有可能接下来主线程有会拿到钥匙,name此时这100个线程接收到了notify的信号,
因为没有拿到钥匙,还是不会执行,UI值会阻塞在acquire() print("第%s个线程执行了"%i) con.release() if __name__ == "__main__": con = Condition() for i in range(100): t = Thread(target=func,args=(con,i))....................开启100个子线程 t.start() while 1: con.acquire() num = input(">>>") con.notify(int(num)) con.release()
time .sleep(0.5).........这必须休眠一下,因为Condition里边包含一个万能钥匙,只有一把钥匙,同一进程可以多次开锁,但不同进程,只能等
另一个进程把钥匙还了,那么此时这个进程才能获取钥匙
3,线程池的多任务提交
1 from concurrent.futures import ThreadPoolExeccuror 2 import time 3 def func(num): 4 sum = 0 5 for i in range(num) 6 sum += i **2 7 print(sum) 8 t = ThreadPoolExecutor(20) 9 start = time .time() 10 t = map(func,range(1000))....提交多个任务给池中.等效于for + submit 11 t.shutdown() 12 print(time.time() - start)
4,线程池的返回值
1 from concurrent.futures import ThreadPoolExecutor 2 def func(num): 3 sum = 0 4 for i in range(num) 5 sum = i ** 2 6 return sum 7 t = ThreadPoolExecutor(20) 8 res = map(func,range(1000)).................此时map返回是一个生成器 9 print(res) 10 t.shutdown() 11 print(res.__next__()) 12 for i in res: 13 print(i)
5,回调函数
1 from concurrent.futures import ProcessPoolExecutor 2 3 import os 4 5 def func(num): 6 7 sum = 0 8 9 for i in range(num): 10 11 sum = i **2 12 13 return sum 14 15 def call_back(res): 16 17 print(res.result(),os.getpid()) 18 if __name__ == "__main__": 19 print(os.getpid()) 20 t = ProcessPoolExecutor(20) 21 for i in range(1000): 22 t.submit(func,i).add_done_callback(call_back) 23 t.shutdown()