首页 > 系统相关 >在Python中用concurrent.futures创建线程池进程池

在Python中用concurrent.futures创建线程池进程池

时间:2024-04-05 18:22:19浏览次数:28  
标签:item Python futures concurrent future time executor

简介

Python3.2 带来了 concurrent.futures 模块,借此能够快速使用线程池和进程池。

对于不需要控制优先级与资源分配的多任务,使用 concurrent.futures 模块快捷优雅。

示例代码与效果

import concurrent.futures
import time

def a_task(x):
    """模拟一个耗时的任务"""
    def  count(number) :
        for i in range(0, 10000000):
                i=i+1
        return i * number
    result_item = count(x)
    return result_item

number_list = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

if __name__ == "__main__":
    # 顺序执行
    start_time = time.time()
    for item in number_list:
        print(a_task(item))
    print("Sequential execution in " + str(time.time() - start_time), "seconds")

    # 线程池执行
    start_time_1 = time.time()
    with concurrent.futures.ThreadPoolExecutor(max_workers=5) as executor:
        futures = [executor.submit(a_task, item) for item in number_list]
        for future in concurrent.futures.as_completed(futures):
            print(future.result())
    print ("Thread pool execution in " + str(time.time() - start_time_1), "seconds")
    
    # 进程池
    start_time_2 = time.time()
    with concurrent.futures.ProcessPoolExecutor(max_workers=5) as executor:
        futures = [executor.submit(a_task, item) for item in number_list]
        for future in concurrent.futures.as_completed(futures):
            print(future.result())
    print ("Process pool execution in " + str(time.time() - start_time_2), "seconds")

运行后可以查看各种方案的耗时。ThreadPoolExecutor 比直接执行快一些。ProcessPoolExecutor 可以不受 GIL 限制,极大缩短执行时间。

使用线程池和进程池

以进程池为例。

要开始使用进行池,首先需要创建一个 executor,用于存放与管理任务。

with concurrent.futures.ProcessPoolExecutor(max_workers=5) as executor:

这里可以用 max_workers 指定并行执行数量,默认为 CPU 核心数。

使用 .submit() 将任务送入到 executor 池中。.submit() 会返回一个 future 对象,这代表已经放入池中的、待完成的任务。

future = executor.submit(some_func, param1, param2)

现在就能够用 .result() 让这一个 future 执行,并获取结果。与直接调用 some_func 不同,这是在进程池里执行的。

result = future.result()

若现在手头有一大堆的 future,那就使用 concurrent.future.as_completed() 全部执行。这会让 executor 参与多进程调度,同时执行多个 future。

for future in concurrent.futures.as_completed(futures):
    print(future.result())

参考来源

标签:item,Python,futures,concurrent,future,time,executor
From: https://www.cnblogs.com/chirp/p/18116037

相关文章

  • Python程序设计 魔法函数
    1.魔法方法Python中有一些特殊方法,它们允许我们的类和Python更好地集成。在标准库参考(StandardLibraryReference)中,它们被称为魔法方法(MagicMethods),是与Python的其他特性无缝集成的基础。例如,我们用字符串来表示一个对象的值。Object 基类包含了__repr__() 和__str__()......
  • Python程序设计 垃圾回收机制&鸭子类型
    1.简介引用计数(python默认):记录该对象当前被引用的次数,每当新的引用指向该对象时,它的引用计数ob_ref加1,每当该对象的引用失效时计数ob_ref减1,一旦对象的引用计数为0,该对象立即被回收标记清除:第一段给所有活动对象标记,第二段清除非活动对象分代回收:python将内存根据对象的存......
  • Python|梯度下降法
    全量梯度下降importnumpyasnp#创建数据集X,ynp.random.seed(1)X=np.random.rand(100,1)y=4+3*X+np.random.randn(100,1)X_b=np.c_[np.ones((100,1)),X]#创建超参数n_iterations=10000t0,t1=5,500#定义一个函数来动态调整学习率defl......
  • 小白学python爬虫1
    """爬虫:通过编写程序来获取互联网上的资源需求:用程序模拟浏览器,输入一个网址,从该网址获取到资源或者内容"""#fromurllib.requestimporturlopen#url网址##url="http://www.baidu.com"#resp=urlopen(url)###print(resp.read().decode("utf-8"))......
  • Python栈和队列
    在计算机科学中,栈(Stack)和队列(Queue)是两种非常重要的数据结构,它们在算法设计和程序开发中扮演着关键角色。Python语言内置了对这两种数据结构的支持,尤其是在其`collections`和`deque`模块中。###栈(Stack)栈是一种后进先出(LastInFirstOut,LIFO)的数据结构,它只允许在一端进行......
  • Python简单函数循环综合实例
    importrandomprint("*"*71)print("*"*27+"欢迎来到名人猜猜猜"+"*"*27)print("*"*29+"Let'sbegining"+"*"*28)character_1='他是巨星'character_2='他是篮球健将'character_3='他身......
  • Python递归调用应用实例-汉诺塔
    递归介绍1.简单的说:递归就是函数自己调用自己,每次调用时传入不同的值2.递归有助于编程者解决复杂问题,同时可以让代码变得简洁汉诺塔传说汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石住子,在一根柱子上从上往下按照大小顺......
  • 10个全面了解python自动化办公代码
    10个全面了解python自动化办公代码当涉及自动化工作时,Python是一种非常强大的编程语言.以下是10个用于自动化工作的Python代码示例:文件操作:自动化文件操作可以帮助您批量处理文件、筛选内容等等. import os# 遍历目录下所有文件for root, dirs, files in ......
  • python(8)
    列表(三)列表,通过下标索引的方法,用赋值运算符将新的值替换进去1.改a=["1","2","3","4"]a[2]="5"["1","2","5","4"]a[2:]=["3","6"]  #切片["1","2",&q......
  • Python实参与形参(1)
    1.函数的定义defone():print("123456")print("123456")one()one()结果:1234561234561234561234562.函数的形参、实参应用defone(frist,last):print("你好",frist)iflast>100:print("你考试考的很好")else:......