Loading

并发编程之线程池与进程池

Python标准模块--concurrent.futures

基本介绍

#1 介绍
concurrent.futures模块提供了高度封装的异步调用接口
ThreadPoolExecutor:线程池,提供异步调用
ProcessPoolExecutor: 进程池,提供异步调用
Both implement the same interface, which is defined by the abstract Executor class.

#2 基本方法
#submit(fn, *args, **kwargs)
异步提交任务

#map(func, *iterables, timeout=None, chunksize=1) 
取代for循环submit的操作

#shutdown(wait=True) 
相当于进程池的pool.close()+pool.join()操作
wait=True,等待池内所有任务执行完毕回收完资源后才继续
wait=False,立即返回,并不会等待池内的任务执行完毕
但不管wait参数为何值,整个程序都会等到所有任务执行完毕
submit和map必须在shutdown之前

#result(timeout=None)
取得结果

#add_done_callback(fn)
回调函数# done()判断某一个线程是否完成# cancle()取消某个任务

ThreadPoolExecutor的使用

from concurrent.futures import ThreadPoolExecutor, ProcessPoolExecutor
import time
import os

# 括号内, 可以传数字, 不传的话默认会开设当前计算机cpu个数5倍的线程
pool = ThreadPoolExecutor(5)  # 池子里面固定只有五个线程
"""
线程池造出来之后, 里面会固定存在五个线程, 这五个线程不会出现重复创建和销毁的过程
"""
"""
池子的使用非常简单:
    你只需要将需要做的任务往池子中提交即可, 自动会有人来服务你
"""


def task(n):
    print(n)
    print(os.getpid())
    time.sleep(2)

    return n * 2"""
任务的提交方式:
    同步: 提交任务之后原地等待任务的返回结果, 期间不做任何事
    异步: 提交任务之后不等待任务的返回结果, 继续往下执行
"""
t_list = []
# pool.submit(task, 1)  # 向池子中提交任务  异步提交
for i in range(20):  # 朝池子中提交20个任务
    res = pool.submit(task, i)
    # print(res.result())
    """
    res.result()
    程序由并发变成了串行,
    任务为什么打印的是None,
    res.result()拿到的是异步提交的任务的返回结果
    """
    t_list.append(res)

# 等待线程池中所有的任务执行完毕之后再进行往下执行
pool.shutdown()  # 关闭线程池, 等待线程池中所有的任务运行完毕

for t in t_list:
    print('>>>:', t.result())

"""
异步任务的返回结果应该通过回调机制来操作
"""

ProcessPoolExecutor的使用

from concurrent.futures import ThreadPoolExecutor, ProcessPoolExecutor
import time
import os

# 括号内, 可以传数字, 不传的话默认会开设当前计算机cpu个数5倍的线程
# pool = ThreadPoolExecutor(5)  # 池子里面固定只有五个线程
pool = ProcessPoolExecutor(5)
"""
线程池造出来之后, 里面会固定存在五个线程, 这五个线程不会出现重复创建和销毁的过程
"""
"""
池子的使用非常简单:
    你只需要将需要做的任务往池子中提交即可, 自动会有人来服务你
"""


def task(n):
    print(n)
    print(os.getpid())
    time.sleep(2)

    return n * 2

def call_back(n):
    print('call_back',n.result)

"""
任务的提交方式:
    同步: 提交任务之后原地等待任务的返回结果, 期间不做任何事
    异步: 提交任务之后不等待任务的返回结果, 继续往下执行
"""
t_list = []
# pool.submit(task, 1)  # 向池子中提交任务  异步提交
for i in range(20):  # 朝池子中提交20个任务
    res = pool.submit(task, i).add_done_callback(call_back)
    # print(res.result())
    """
    res.result()
    程序由并发变成了串行,
    任务为什么打印的是None,
    res.result()拿到的是异步提交的任务的返回结果
    """
    t_list.append(res)

# 等待线程池中所有的任务执行完毕之后再进行往下执行
pool.shutdown()  # 关闭线程池, 等待线程池中所有的任务运行完毕

for t in t_list:
    print('>>>:', t.result())

"""
异步任务的返回结果应该通过回调机制来操作
"""

 

posted @ 2020-07-28 16:03  愚者丶  阅读(165)  评论(0编辑  收藏  举报