线程池,锁

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()
原文地址:https://www.cnblogs.com/ljc-0923/p/9632572.html