小白学python------------------进程池与线程池

一.什么是池

池的功能是限制启动的进程数或线程数

那么什么时候应该限制?

当并发的任务数远远超过了计算机的承受能力时,即无法一次性开启过多的进程数或线程数时,就应该用池的概念将开启的进程数或线程数限制在计算机可承受的范围内

二.同步与异步

同步:提交任务后就在原地等待,直到任务运行完毕后拿到任务的返回值,再继续运行下一行代码,会导致任务是串行执行的

异步:提交任务(绑定一个回调函数)后不在原地等待,直接执行下一行代码,等到任务有返回值后会自动触发回调函数.会导致任务是并发执行的

三.进程池与线程池的区别是看回调函数是由谁去触发执行

进程池是由主进程去执行

线程池是由子线程自己执行

# 关键要搞明白什么时候用进程池什么时候用线程池(就是搞明白什么时候用进程什么时候用线程)
from concurrent.futures import ProcessPoolExecutor,ThreadPoolExecutor
import os,time,random

def task(n):
    print('%s is running'%os.getpid())
    time.sleep(random.randint(1,3))
    return n**2


#异步调用
if __name__ == '__main__':
    pool = ProcessPoolExecutor(4)

    l = []
    for i in range(1,10):
        future = pool.submit(task,i)
        l.append(future)
    pool.shutdown(wait=True)
    #shutdown代表关闭进程池的入口,不再允许往进程池里提交任务,类似join+倒计数的效果,并且在原地等待所有任务运行完毕
    #进程池内的任务都运行完了才往下执行代码
    for future in l:
        print(future.result())
    print('主')


'''
这样写就变成了同步了
if __name__ == '__main__':
    pool = ProcessPoolExecutor(4)
    for i in range(1,10):
        future = pool.submit(task,i)
        print(future)
        print(future.result())
    print('主')
'''
进程池
from concurrent.futures import ProcessPoolExecutor,ThreadPoolExecutor
import os,time,random


def task(n):
    print('%s is running'%os.getpid())
    time.sleep(5)
    return n**2


def parse(future):
    time.sleep(1)
    res = future.result()
    print('%s 处理了 %s'%(os.getpid(),res))


#异步
if __name__ == '__main__':
    pool = ProcessPoolExecutor(4)

    start = time.time()
    for i in range(1,5):
        future = pool.submit(task,i)
        #提交完任务以后,直接为future绑定一个回调函数,这个函数会在futurte有结果立马触发,然后把future当着参数传给parse
        future.add_done_callback(parse) #parse会在future有返回值时立刻触发,并且将future当作参数传入
    pool.shutdown(wait=True)
    stop = time.time()
    print('主',os.getpid(),stop-start)
from concurrent.futures import ProcessPoolExecutor,ThreadPoolExecutor
from threading import current_thread
import os,time,random

线程池
def task(n):
    print('%s is running'%current_thread().name)
    time.sleep(3)
    return n**2

def parse(future):
    time.sleep(1)
    res = future.result()
    print('%s 处理了 %s'%(current_thread().name,res))

if __name__ == '__main__':
    pool = ThreadPoolExecutor(4)
    start = time.time()
    for i in range(10):
        future = pool.submit(task,i)
        future.add_done_callback(parse) #parse会在future有返回值时立刻触发,并且将future当作参数传入
    pool.shutdown(wait=True)
    stop = time.time()
    print('主',current_thread().name,stop-start)

猜你喜欢

转载自blog.csdn.net/qq_42721964/article/details/82587323
今日推荐