第二十九天

今日内容

一、进程池与线程池

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("主")
posted @ 2021-02-21 18:46  抓鬼少年  阅读(36)  评论(0编辑  收藏  举报