0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

python创建线程池的两种方法

python爬虫知识分享 来源:python爬虫知识分享 作者:python爬虫知识分享 2022-03-16 16:15 次阅读

1. 使用内置模块

在使用多线程处理任务时也不是线程越多越好,由于在切换线程的时候,需要切换上下文环境,依然会造成cpu的大量开销。为解决这个问题,线程池的概念被提出来了。预先创建好一个合理数量的线程池,让过来的任务立刻能够使用,就形成了线程池。

Python3中,创建线程池是通过concurrent.futures函数库中的ThreadPoolExecutor类来实现的。

import time
import threading
from concurrent.futures import ThreadPoolExecutor

def target():
    for i in range(5):
        print('running thread-{}:{}'.format(threading.get_ident(), i))
        time.sleep(1)

# 创建一个最大容纳数量为5的线程池
pool = ThreadPoolExecutor(5)

for i in range(10):
    # 往线程池上塞任务
    pool.submit(target)

创建线程池还可以使用更优雅的方式,就是使用上下文管理器

with ThreadPoolExecutor(5) as pool:
    for i in range(100):
        pool.submit(target)

直接运行代码,从输出可以看出,前面我们设置线程池最大线程数,会保证“同时”仅有五个线程在工作。

running thread-123145483767808:0
running thread-123145489022976:0
running thread-123145494278144:0
running thread-123145499533312:0
running thread-123145504788480:0
running thread-123145483767808:1
running thread-123145489022976:1
running thread-123145499533312:1
running thread-123145494278144:1
running thread-123145504788480:1
running thread-123145489022976:2
running thread-123145499533312:2
running thread-123145483767808:2
running thread-123145504788480:2
running thread-123145494278144:2
....

示例完毕,来说明一下:

使用 with 语句 ,通过 ThreadPoolExecutor 构造实例,同时传入 max_workers 参数来设置线程池中最多能同时运行的线程数目。

使用 submit 函数来提交线程需要执行的任务到线程池中,并返回该任务的句柄(类似于文件、画图),注意 submit() 不是阻塞的,而是立即返回。

通过使用 done() 方法判断该任务是否结束。上面的例子可以看出,提交任务后立即判断任务状态,显示四个任务都未完成。在延时2.5后,task1 和 task2 执行完毕,task3 仍在执行中。

使用 result() 方法可以获取任务的返回值。

2. 自定义线程池

除了使用上述第三方模块的方法之外,我们还可以自己结合前面所学的消息队列来自定义线程池。

这里我们就使用queue来实现一个上面同样效果的例子,大家感受一下。

import time
import threading
from queue import Queue

def target(queue):
    while True:
        task = queue.get()
        if task == "stop":
            queue.task_done()
            break

        task()
        queue.task_done()

def do_task():
    for i in range(5):
        print('running thread-{}:{}'.format(threading.get_ident(), i))
        time.sleep(1)


class MyQueue(Queue):
    def close(self):
        for i in range(self.maxsize):
            self.put("stop")

def custome_pool(task_func, max_workers):
    queue = MyQueue(max_workers)
    for n in range(max_workers):
        t = threading.Thread(target=task_func, args=(queue,))
        t.daemon = True
        t.start()

    return queue



pool = custome_pool(task_func=target, max_workers=5)

for i in range(10):
    pool.put(do_task)

pool.close()
pool.join()

输出是和上面是完全一样的效果

running thread-123145469886464:0
running thread-123145475141632:0
running thread-123145485651968:0
running thread-123145490907136:0
running thread-123145480396800:0
running thread-123145469886464:1
running thread-123145480396800:1
running thread-123145475141632:1
running thread-123145490907136:1
running thread-123145485651968:1
...

构建线程池的方法,是可以很灵活的,大家有空可以自己多研究。但是建议只要掌握一种自己熟悉的,能快速上手的就好了。
审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 模块
    +关注

    关注

    7

    文章

    2536

    浏览量

    46756
  • 函数
    +关注

    关注

    3

    文章

    4117

    浏览量

    61550
  • python
    +关注

    关注

    53

    文章

    4701

    浏览量

    83700
收藏 人收藏

    评论

    相关推荐

    Multisim仿真幅频特性曲线和相频特性曲线的两种方法

    Multisim仿真幅频特性曲线和相频特性曲线的两种方法
    的头像 发表于 12-11 17:29 1w次阅读
    Multisim仿真幅频特性曲线和相频特性曲线的<b class='flag-5'>两种方法</b>

    利用SPICE进行放大器稳定性分析的两种方法

    利用SPICE进行放大器稳定性分析的两种方法
    的头像 发表于 12-05 15:38 4530次阅读
    利用SPICE进行放大器稳定性分析的<b class='flag-5'>两种方法</b>

    线程池的创建方式有几种

    线程池是一种用于管理和调度线程的技术,能够有效地提高系统的性能和资源利用率。它通过预先创建一组线程并维护一个工作队列,将任务提交给线程池来处
    的头像 发表于 12-04 16:52 524次阅读

    python怎么让前面的不运行

    注释。下面是关于如何让前面的代码不运行的几种方法: 使用单行注释:使用#符号将要禁止运行的代码行注释掉,以此告诉Python解释器不要执行该行代码。例如: # 这是一个示例代码行 # print("Hello, World!") # 此行代码被注释掉,不会被执行 p
    的头像 发表于 11-29 15:06 897次阅读

    查看python安装路径的方法

    如何查看Python安装路径,以及各个操作系统下的细节和注意事项。 一、Windows操作系统下查看Python安装路径的方法 对于Windows操作系统,有多种方法可以查看
    的头像 发表于 11-29 14:54 1794次阅读

    PoE以太网供电的两种方法

    PoE以太网供电的两种方法  PoE(Power over Ethernet)以太网供电是一种通过以太网电缆向网络设备传输电力的技术。它可以为无线接入点、IP电话、网络摄像机、交换机等设备提供
    的头像 发表于 11-28 15:51 632次阅读

    python循环创建变量并赋值

    Python中如何使用循环创建变量并赋值,以及它的一些应用场景。 首先,让我们来了解一下Python中的循环。Python提供了两种常用的
    的头像 发表于 11-23 14:51 803次阅读

    python怎么创建二维数组

    如何创建二维数组在Python中是一个常见的问题。在Python中,我们可以使用嵌套的列表(list of lists)或者使用NumPy库来创建二维数组。在本文中,我们将详细介绍这
    的头像 发表于 11-21 15:10 2280次阅读

    python的insert方法

    insert()方法Python中的列表对象提供的一个方法,用于在指定位置插入一个元素。该方法的语法如下: list. insert ( index , obj) 其中,index表
    的头像 发表于 11-21 14:27 972次阅读

    线程同步的几种方法

    线程同步是指在多个线程并发执行的情况下,为了保证线程执行的正确性和一致性,需要采用特定的方法来协调线程之间的执行顺序和共享资源的访问。下面
    的头像 发表于 11-17 14:16 694次阅读

    Java中的线程池包括哪些

    线程池是用来统一管理线程的,在 Java 中创建和销毁线程都是一件消耗资源的事情,线程池可以重复使用线程
    的头像 发表于 10-11 15:33 641次阅读
    Java中的<b class='flag-5'>线程</b>池包括哪些

    C语言获取文件长度的两种方法

    C语言中没有直接获取文件长度的接口,但是我们可以使用标准库提供的函数来间接的获取文件长度。这里提供两种方法
    的头像 发表于 10-10 16:15 821次阅读
    C语言获取文件长度的<b class='flag-5'>两种方法</b>

    不同创建线程安全Set的方式

    线程安全的问题,真的算是老生常谈了。这几天看到一个 HashSet 线程安全的骚操作,在这里分享给大家。 在本文中,我们将分享如何构造线程安全的HashSet的几种方法
    的头像 发表于 09-25 14:20 444次阅读

    python有什么用 如何用python创建数据库

    python有什么用 如何用python创建数据库 Python是一种高级编程语言,可以用于开发各种类型的应用程序和工具。它的广泛应用使它在编程领域中极为受欢迎。
    的头像 发表于 08-28 16:41 939次阅读

    图腾柱TCM之两相变频错相的两种方法

    目前而言,TCM的错相方法两种:开环180deg固定错相,以及闭环实时调节错相;在我们的代码中,我们同时采用了这两种方法
    的头像 发表于 08-20 10:03 753次阅读
    图腾柱TCM之两相变频错相的<b class='flag-5'>两种方法</b>