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

线程池&进程池

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

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

import time 
from concurrent.futures import ThreadPoolExecutor
def 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 ThreadPoolExecutor
def 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 time
from concurrent.futures import ThreadPoolExecutor
def 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 time
from concurrent.futures import ProcessPoolExecutor
def 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 monkey
monkey.patch_all()
import time
import gevent
def 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操作用协程

猜你喜欢

转载自www.cnblogs.com/womenzt/p/12430174.html
今日推荐