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操作用协程