• 线程池,锁


    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()
  • 相关阅读:
    我们是如何实现DevOps的
    cmp命令
    全排列II
    chown命令
    两个数组的交集II
    MVVM模式的理解
    chmod命令
    路径总和
    cat命令
    跳水板
  • 原文地址:https://www.cnblogs.com/ljc-0923/p/9632572.html
Copyright © 2020-2023  润新知