欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

线程池与进程池

程序员文章站 2022-05-01 13:00:47
...

1、线程池

从Python3.2开始,标准库为我们提供了concurrent.futures模块,它提供了ThreadPoolExecutorProcessPoolExecutor两个类,实现了对threadingmultiprocessing的更高级的抽象,是使用异步实现,充分利用CPU提高程序执行效率,对编写线程池/进程池提供了直接的支持,而传统的进程池/线程池是使用阻塞式实现的;python2.7版本可以安装futures模块,使用方式和python3一样。
其中:concurrent.futures基础模块是executor和future

调用线程池的简化代码:

import concurrent.futures
with concurrent.futures.ThreadPoolExecutor(max_workers=5) as executor:
    future_to_domains = {executor.submit(guess_new_subdomains_and_ips, domain): domain for domain in domains_set}
    for future in concurrent.futures.as_completed(future_to_domains):
        url = future_to_domains[future]
        try:
            data = future.result(timeout=10)  # 有处理比较慢的,需要加超时处理,例如爬虫
        except Exception as exc:
            print exc
""" 异步线程池可以直接获得函数返回结果 """
from concurrent.futures import ThreadPoolExecutor
import time

def return_future_result(message):
    time.sleep(2)
    return message

pool = ThreadPoolExecutor(max_workers=2)  # 创建一个最大可容纳2个task的线程池
future1 = pool.submit(return_future_result, ("hello"))  # 往线程池里面加入一个task
future2 = pool.submit(return_future_result, ("world"))  # 往线程池里面加入一个task
print(future1.done())  # 判断task1是否结束
time.sleep(3)
print(future2.done())  # 判断task2是否结束
print(future1.result())  # 查看task1返回的结果
print(future2.result())  # 查看task2返回的结果

concurrent.futures的详细使用参见如下链接:

https://blog.csdn.net/dutsoft/article/details/54728706

线程池和进程池的使用方式类似,只需将Thread换成Process

相关标签: 线程池 进程池