Python-线程池、进程池,协程

线程池&进程池

在python2中没有提供,在python3之后才提供

  • 作用:保证程序中最多可以创建的线程的个数

import time from concurrent.futures import ThreadPoolExecutordef task(n1,n2):    time.sleep(1)    print(‘星空不问赶路人‘)pool = ThreadPoolExecutor(10) # 创建线程池for i in range(100):    pool.submit(task,i,1)pool.shutdown(True) # 等线程池中任务执行完毕之后,再继续往后走print(‘岁月不负有心人‘)
import time from concurrent.futures import ThreadPoolExecutordef task(arg):    time.sleep(1)    print(‘星空不问赶路人‘)    return ‘岁月不负有心人‘ret = pool.map(task,range(1,20))  # 具有返回值print(‘end‘,ret)pool.shutdwon(True)for i in ret:    print(i)   # 直接输出i
import timefrom concurrent.futures import ThreadPoolExecutordef task(n1,n2)    time.sleep(1)    print(‘星空不问赶路人‘)    return ‘岁月不负有心‘+str(n1+n2)pool = ThradPoolExecutor(10)  # 创建进程future_list = []for i in range(20):    fu = pool.submit(task,i,1) # 具有返回值    future_list.append()pool.shutdown(True)for i in future_list:    print(i.result())   # 后面加result

进程池

import timefrom concurrent.futures import ProcessPoolExecutordef task(n1,n2):    time.sleep(1)    print(‘many are called,few are chosen‘)pool = ProcessPoolExecutor(10)if __name__ == ‘__main__‘:    for i in range(20):        pool.submit(task,i,1)    pool.shutdown(True)    print(‘early birds get the worm‘)

引入进程池和线程池的目的:限制创建线程或进程的个数,防止无节制创建线程,导致效率降低

pool = ProcessPoolExecutor(10)中的10表示最多创建10个

创建线程越多越好?

不是,线程创建的如果过多。导致线程上下文切换过多,效率降低

协程

协程非常节省资源,实际不存在,程序员创建的

协程又可以称为‘微线程’,实际上是让一个线程轮番去执行一些任务协程+IO切换的功能就可以完成并发的操作协程+IO切换本质上节省资源

协程+IO切换的实例

  • gevent(内部依赖greenlet)

  • pip3 install gevent

from gevent import monkeymonkey.patch_all()import time import geventdef eat():    print(‘夜已沉默‘)    time.sleep(3)    print(‘人生风景在游走‘)def play():    print(‘心事向谁说‘)    time.sleep(3)    print(‘每当孤独我回首‘)g1 = gevent.spawn(eat)g2 = gevent.spawn(play)gevent.joinall([g1,g2])?# 夜已沉默# 心事向谁说# 人生风景在游走# 每当孤独我回首
进程/线程/协程的区别:        进程是计算机中分配资源最小的单位,线程是计算机中被cpu调度最小的单位;        协程又称为"微线程",是基于人为代码创造的,而进程和线程是计算机中真是存在的,            一个进程中可以创建多个线程,且资源共享,一个线程可以创建多个协程        计算密集型,多进程        IO密集型,多线程/协程+IO切换        单纯的协程是没有办法提高并发,只是代码之间来回切换,加上IO自动切换才有意义,有IO操作用协程