队列与线程补充,协程

队列  (同一个进程内的队列 , 多线程)

  import queue  queue.Queue()  先进先出  queue.lifoQueue()  后进先出  queue.PriorityQueue()  优先级队列

  q = queue.PriorityQueue()

  q.put()   接收的是一个元组

  元组中的第一个参数是 : 表示当前数据的优先级

  元组中的第二个参数是 : 需要存放到队列中的数据

  优先级的比较(表示优先级的类型必须是一致的)

  如果都是int,比数值的大小,优先选出数值较小的

  如果都是str ,比较字符串的大小,(从第一个字符串的ASCAII码开始比较)优先选出ASCAII码中靠前的.

 

线程池

  存放固定数量的线程,这些线程等待任务,一旦有任务,就线程自动执行任务.

  线程的最佳数量 max_workers = (os.CPU_count() or 1) * 5

from concurrent.futures import ThreadPoolExecutor,ProcessPoolExecutor #线程异步和进程异步
#concurrent.futures  这个模块是异步调用机制
#from multiprocessing import Pool  这个模块既可以异步也可以同步,

def func (num) :
    sum = 0
    for i in range(num) :
        sum += i**2
    print(sum)

if __name__ == '__main__':
    p = ThreadPoolExecutor(10)
    for n in range(100):
        #p.submit(func , args=(n,))
        p.submit(func , n)#提交任务
    p.shutdown()#等效于进程池中的close+join  是指让父线程等待池中所有进程执行完所有任务

  

  如何把多个任务放入线程池

  for + submit 的方式提交多个任务

  map(func , iterable)方式去提交多个任务

 

 

  通过进程池线程池的效率比较

    不管是Pool 的进程池还是ProcessPoolExecutor() 的进程池,执行效率相当

    ThreadPoolExecutor 的效率要差很多

    所以当计算密集时,使用多进程.

 

  线程返回值

    用for + submit 方式提交多个任务,用result方法拿结果

from concurrent.futures import ThreadPoolExecutor,ProcessPoolExecutor #线程异步和进程异步
#concurrent.futures  这个模块是异步调用机制
#from multiprocessing import Pool  这个模块既可以异步也可以同步,

def func (num) :
    sum = 0
    for i in range(num) :
        sum += i**2
    return sum

if __name__ == '__main__':
    p = ThreadPoolExecutor(10)
    re = []
    for n in range(100):
        #p.submit(func , args=(n,))
        r = p.submit(func , n)#提交任务
        re.append(r)
    #p.shutdown()#等效于进程池中的close+join  是指让父线程等待池中所有进程执行完所有任务
    [print(i.result()) for i in re ]
#在pool 进程中那结果,用get方法 , 在ThreadPoolExecutor中拿结果使用result方法

 

    用map的方式提交多个任务, 返回的是生成器对象,用__next__() 方法拿结果

 

 

  回调函数

  线程池中的回调函数是子线程调用的,和父线程没有关系;

  进程池中的回调函数是父进程调用的,和子进程没有关系.

 

 

协程

 

posted @ 2018-08-29 20:36  panda/勇  阅读(257)  评论(0编辑  收藏  举报