首页 > 编程语言 >python多线程与线程池

python多线程与线程池

时间:2024-09-28 22:34:45浏览次数:8  
标签:__ Task python 任务 线程 time 多线程


线程:是任务的执行者。
进程:是一个动态的概念。
适用情况:
IO密集用多线程。
CPU密集用多进程。

原因:Cpython解释器中使用了GIL全局解释锁,一个进程只有一个锁。只有拿到这个锁的线程才能获取解释器,取解释执行代码。这就导致了即使开了多线程,实际上只有一个线程在执行。
      因此当进行CPU计算密集的任务时候。即使开了多线程也没用。故而需要实现多进程,这样才能保证几个计算是同时执行的。


线程池:
线程的创建和销毁都需要消耗资源。为了避免频繁的创建销毁线程造成资源浪费。提出了多线程的概念。
线程池实际上就是规定了一个最大线程数,同时实现了任务队列。
当一个任务到来的时候,如果有空线程,则将任务分配给该线程。
如果没有空线程,则检查当前存在的线程数是否<最大线程数。
如果小于,则创建线程,分配任务。
如果已经达到了最大线程数,那么不好意思,您去任务队列里排队等着线程空出来。

  线程池的一些缺点包括:

    需要合理配置:线程池的性能和效果受到配置参数的影响,需要根据具体的应用场景和硬件环境来合理配置线程池的大小、任务队列的大小等参数。
    可能引发资源泄露:如果线程池中的线程长时间闲置而不被使用,可能会导致资源的浪费和泄露。
    可能引发死锁:在使用线程池时,如果任务之间存在依赖关系,可能会引发死锁问题,需要额外的注意和处理。

代码:

import time
from concurrent.futures import ThreadPoolExecutor, as_completed

def task(n):
    """模拟一个耗时任务"""
    print(f"Task {n} started at {time.strftime('%H:%M:%S', time.localtime())}")
    time.sleep(n)
    print(f"Task {n} finished at {time.strftime('%H:%M:%S', time.localtime())}")
    return n * n

def main():
    # 定义任务列表
    tasks = [1, 2, 3, 4, 5]

    # 创建一个线程池,最多同时运行5个线程
    with ThreadPoolExecutor(max_workers=5) as executor:
        # 提交任务到线程池
        futures = {executor.submit(task, n): n for n in tasks}

        # 处理已完成的任务
        for future in as_completed(futures):
            n = futures[future]
            try:
                result = future.result()
                print(f"Task {n} returned: {result}")
            except Exception as e:
                print(f"Task {n} generated an exception: {e}")

if __name__ == "__main__":
    main()

标签:__,Task,python,任务,线程,time,多线程
From: https://www.cnblogs.com/jiyuebo/p/18438535

相关文章

  • 华为OD机试2024年E卷-转骰子[200分]( Java | Python3 | C++ | C语言 | JsNode | Go )实
    题目描述骰子是一个立方体,每个面一个数字,初始为左1,右2,前3(观察者方向),后4,上5,下6,用123456表示这个状态,放置在平面上,可以向左翻转(用L表示向左翻转1次),可以向右翻转(用R表示向右翻转1次),可以向前翻转(用F表示向前翻转1次),可以向后翻转(用B表示向后翻转1次),可以逆时针旋转(......
  • 华为OD机试2024年E卷-矩阵匹配[200分]( Java | Python3 | C++ | C语言 | JsNode | Go )
    题目描述从一个N*M(N≤M)的矩阵中选出N个数,任意两个数字不能在同一行或同一列,求选出来的N个数中第K大的数字的最小值是多少。输入描述输入矩阵要求:1≤K≤N≤M≤150输入格式:NMKN*M矩阵输出描述N*M的矩阵中可以选出M!/N!种组合数组,每个组合......
  • Windows系统+PyCharm IDE中python-cuda配置步骤
    0.我的主机“码头”所使用的GPU型号为NVIDIAGeForceRTX3070;在pycharm中,常用Anacondaprompt创建虚拟环境;1.解决思路:从根本上出发:GPU、项目对pytorch的版本要求是否兼容下面记录安装python和torch后如何配置cuda和cudnn。2.首先,使用shell查看shell:nvidia-smi#显......
  • C++多线程与并发类面试题
    题目来源:https://subingwen.cn/cpp/thread/https://mp.weixin.qq.com/s?__biz=Mzg4NDQ0OTI4Ng==&mid=2247489580&idx=1&sn=b9ac83040601230ff897f3394e956cea&chksm=cfb95145f8ced8536d5dcfa7d3165e3a51f5cb40e52f699745df0d8f71e4f7591674cd5cf156&token=......
  • python切片步长负数怎么理解
    字符串截取,也叫字符串切片,使用方括号[]来截取字符串,在Python中单字符也是作为一个字符串使用。字符串[开始索引:结束索引:步长]开始索引:从指定位置开始截取;结束索引:从指定位置结束截取,但不包含该位置的字符。步长:不指定时步长为1;字符串[开始索引:结束索引]。首先我们了解......
  • Python函数的魔法:定义与调用的艺术
    引言:你是否曾被代码困住?想象一下,你正在编写一个复杂的程序,突然间,代码的逻辑变得混乱不堪,像是一团乱麻。你是否曾经想过,为什么有些代码看起来如此简洁,而有些却让人头疼不已?答案往往在于函数的使用。函数不仅是代码的“魔法师”,更是我们编程旅程中的得力助手。在这篇文章中,我们......
  • Python中的单元测试:提高代码质量和可靠性
    在软件开发过程中,确保代码的质量和可靠性是非常重要的。单元测试是一种有效的手段,它通过验证代码的各个部分是否按预期工作,帮助开发者发现和修复潜在的问题。Python提供了unittest模块,这是一个内置的单元测试框架,可以帮助你轻松地编写和运行单元测试。本文将详细介绍如......
  • Python中的数据处理与分析:从基础到高级
    在数据科学和数据分析领域,Python凭借其丰富的库和强大的生态系统,成为了最受欢迎的语言之一。本文将从基础到高级,详细介绍如何使用Python进行数据处理和分析,涵盖数据清洗、数据转换、数据可视化等多个方面。1.数据导入与导出在进行数据处理和分析之前,首先需要将数据导入......
  • 线程的run()和start()有什么区别?
    run()方法:run()方法是Thread类的一个普通方法,用于定义线程的主体逻辑。当直接调用run()方法时,该方法会在当前线程的上下文中执行,而不会创建新的线程。直接调用run()方法,不会实现多线程的并发执行,而只是在当前线程中按照顺序执行run()方法的内容。publicclassMyRunn......
  • Python 潮流周刊#71:PyPI 应该摆脱掉它的赞助依赖(摘要)
    本周刊由Python猫出品,精心筛选国内外的250+信息源,为你挑选最值得分享的文章、教程、开源项目、软件工具、播客和视频、热门话题等内容。愿景:帮助所有读者精进Python技术,并增长职业和副业的收入。分享了12篇文章,12个开源项目,1则音视频,全文2000字。以下是本期摘要:......