今日内容
一、进程池与线程池
1.1进程池与线程池
#计算密集型用多进程,因为不能无限开进程所以采用进程池限制开启数量
#IO密集型用多线程,因为不能无限开启多线程所以采用线程池限制开启数量
from concurrent.futures import ProcessPoolExecutor,ThreadPoolExecutor
from threading import current_thread #查看线程名称
import os,time,random
def task(n):
# print("%s is runing" %os.getpid())
print("%s is runing" %current_thread().name)
time.sleep(random.randint(1,3))
return n**2
def handle(futrue):
res = futrue.result()
# print("%s 正在处理结果: %s" %(os.getpid(),res))
print("%s 正在处理结果: %s" %(current_thread().name,res))
time.sleep(2)
if __name__ == '__main__':
# pool = ProcessPoolExecutor(max_workers=4) #指定进程池大小
pool = ThreadPoolExecutor(max_workers=10) #指定线程池大小
for i in range(19):
pool.submit(task,i).add_done_callback(handle) #回调函数
pool.shutdown(wait=True)
二、协程
2.1协程的概念:单线程下实现的并发
特点:自己的应用程序实现多个人的调度,从一个任务切换到另一个任务,把单线程下的IO时间缩短到极致
不是所有的协程都有意义,只有遇到IO才切换的协程才有意义
缺点:
1、不能实现并行
2、单线程下的多个任务一旦遇到IO,整个线程都会阻塞,所有任务都停滞
#gevent:会监测IO行为,进行切换并记录状态
#举例:
from gevent import monkey;monkey.patch_all() #会将以下代码IO行为转换为gevent能监测的形式
import time,gevent
def eat(name):
print('%s eat 1' % name)
time.sleep(2)
print('%s eat 2' % name)
def play(name):
print('%s play 1' % name)
time.sleep(1)
print('%s play 1' % name)
g1 = gevent.spawn(eat,"egon")
g2 = gevent.spawn(play,"egon")
g1.join()
g2.join()
print("主")