python 多线程 线程池的四种实现方式

Python 多线程 threading和multiprocessing模块 线程是一个进程的实体,是由表示程序运行状态的寄存器(如程序计数器、栈指针)以及堆栈组成,它是比进程更小的单位。 线程是程序中的一个执行流。一个执行流是由CPU运行程序代码并操作程序的数据所形成的。因此,线程被认为是以CPU为主体的行为。 线程不包含进程地址空间中的代码和数据,线程是计算过程在某一时刻的状态。所以, multiprocessing.Thread threading.dummy 阅读详情
AI摘要

本文详细介绍了Python中实现线程池的四种方法:multiprocessing.dummy.Pool、multiprocessing.pool.ThreadPool、concurrent.futures.ThreadPoolExecutor以及threadpool模块。通过实例展示了非阻塞和阻塞操作,以及如何获取执行结果。适合对Python多线程和线程池感兴趣的开发者参考。

python 线程池的四种实现方式

线程简述

 一个程序运行起来后,一定有一个执行代码的东西,这个东西就是线程;
 一般计算(CPU)密集型任务适合多进程,IO密集型任务适合多线程;
一个进程可拥有多个并行的(concurrent)线程,当中每一个线程,共享当前进程的资源

以下是对发现的几种多线程进行的汇总整理,均已测试运行
多线程实现的四种方式分别是:
multiprocessing下面有两种:

from multiprocessing.dummy import Pool as ThreadPool  # 线程池

from multiprocessing.pool import ThreadPool   # 线程池,用法无区别,唯一区别这个是线程池

另外两种:
from concurrent.futures import ThreadPoolExecutor  # python原生线程池,这个更主流

import threadpool  # 线程池,需要 pip install threadpool,很早之前的

方式1 multiprocessing.dummy Pool()

  • 非阻塞方法
    multiprocessing.dummy.Pool.apply_async() 和 multiprocessing.dummy.Pool.imap()
    线程并发执行

  • 阻塞方法
    multiprocessing.dummy.Pool.apply()和 multiprocessing.dummy.Pool.map()
    线程顺序执行

from multiprocessing.dummy import Pool as Pool
import time

def func(msg):
    print('msg:', msg)
    time.sleep(2)
    print('end:')
    
pool = Pool(processes=3)
for i in range(1, 5):
    msg = 'hello %d' % (i)
    pool.apply_async(func, (msg,))  # 非阻塞,子线程有返回值
    # pool.apply(func,(msg,))       # 阻塞,apply()源自内建函数,用于间接的调用函数,并且按位置把元祖或字典作为参数传入。子线程无返回值
    # pool.imap(func,[msg,])        # 非阻塞, 注意与apply传的参数的区别 无返回值
    # pool.map(func, [msg, ])       # 阻塞 子线程无返回值

print('Mark~~~~~~~~~~~~~~~')
pool.close()
pool.join()  # 调用join之前,先调用close函数,否则会出错。执行完close后不会有新的进程加入到pool,join函数等待所有子进程结束
print('sub-process done')

运行结果:在这里插入图片描述

方式2:multiprocessing.pool ThreadPool Threading()

from multiprocessing.pool import ThreadPool   # 线程池,用法无区别,唯一区别这个是线程池
from multiprocessing.dummy import Pool as ThreadPool  # 线程池
import os
import time

print("hi outside of main()")


def hello(x):
    print("inside hello()")
    print("Proccess id: %s" %(os.getpid()))
    time.sleep(3)
    return x*x


if __name__ == "__main__":
    p = ThreadPool(5)
    pool_output = p.map(hello, range(3))
    print(pool_output)

运行结果:
在这里插入图片描述

方式3:主流ThreadPoolExecutor

from concurrent.futures import ThreadPoolExecutor
import threading
import time

# 定义一个准备作为线程任务的函数
def action(max):
    my_sum = 0
    for i in range(max):
        print(threading.current_thread().name + '  ' + str(i))
        my_sum += i
    return my_sum
# 创建一个包含2条线程的线程池
pool = ThreadPoolExecutor(max_workers=2)
# 向线程池提交一个task, 20会作为action()函数的参数
future1 = pool.submit(action, 20)
# 向线程池再提交一个task, 30会作为action()函数的参数
future2 = pool.submit(action, 30)
# 判断future1代表的任务是否结束
print(future1.done())
time.sleep(3)
# 判断future2代表的任务是否结束
print(future2.done())
# 查看future1代表的任务返回的结果
print(future1.result())
# 查看future2代表的任务返回的结果
print(future2.result())
# 关闭线程池
pool.shutdown()

运行结果:
在这里插入图片描述

方式4:threadpool

需要 pip install threadpool

import threadpool


def hello(m, n, o):
    """"""
    print("m = %s, n = %s, o = %s" % (m, n, o))


if __name__ == '__main__':
    # 方法1
    # lst_vars_1 = ['1', '2', '3']
    # lst_vars_2 = ['4', '5', '6']
    # func_var = [(lst_vars_1, None), (lst_vars_2, None)]
    # 方法2
    dict_vars_1 = {'m': '1', 'n': '2', 'o': '3'}
    dict_vars_2 = {'m': '4', 'n': '5', 'o': '6'}
    func_var = [(None, dict_vars_1), (None, dict_vars_2)]
    # 定义了一个线程池,表示最多可以创建poolsize这么多线程
    pool = threadpool.ThreadPool(2)
    # 调用makeRequests创建了要开启多线程的函数,以及函数相关参数和回调函数,其中回调函数可以不写
    requests = threadpool.makeRequests(hello, func_var)
    [pool.putRequest(req) for req in requests]   # 将所有要运行多线程的请求扔进线程池
    pool.wait()   # 等待所有线程完成工作后退出

"""
[pool.putRequest(req) for req in requests]等同于
  for req in requests:  
     pool.putRequest(req) 
"""

运行结果:
在这里插入图片描述

Python中多线程和线程池的使用方法 Python是一种高级编程语言,它在众多编程语言中,拥有极高的人气和使用率。Python中的多线程和线程池是其强大的功能之一,可以让我们更加高效地利用CPU资源,提高程序的运行速度。本篇博客将介绍Python中多线程和线程池的使用方法,并提供一些实用的案例供读者参考。一、多线程多线程是指在同一进程中,有多个线程同时执行不同的任务。Python中的多线程是通过threading模块来实现的。上述代码中,我们定义了一个task函数,它接受一个参数num,用于标识任务。 阅读详情

相关推荐

python并发爬虫——多线程、线程池实现

python并发爬虫——多线程、线程池实现 一个网络爬虫通常由发送请求、获取响应、解析页面、本地保存等这几部分组成。其中最难,细节最多的当然是页面解析环节,对于不同的页面,其解析难度必然又所差异,甚至有些安全性较高的网站还设有各种反扒机制,想要获取需要的信息需要视具体情况而言。当然这些内容不在本篇的介绍范围内。本文主要内容是针对如何使用多线程、线程池进行并发操作,提高爬虫的爬取效率。 一、常规网络爬虫 1. 执行顺序 通常,我们在使用爬虫对网页进行爬取的时候,往往采用requests库发送get请求,获取响

sixteen_16的博客 8109

python multiprocessing dummy Pool 使用

本文内容: python multiprocessing.dummy Pool多线程、进程任务队列使用 http压力测试简单示例 工作中有个常用的场景,比如现在需要下载10W张图片,我们不可能写个for循环一张一张的下载吧,又或者是我们做个简单的HTTP压力测试肯定是要使用多个,进程或者线程去做(每个请求handler,会有一个参数(所有的参数生成一个队列))然后把handler和队列map到Poo

常思考->有目标->重实践->善反思 1万+

python-21-线程池和进程池python并发编程

python并发编程线程池和进程池

qq_20466211的博客 3368

Python3多进程多线程(带参数)multiprocessing

之前用python写多进程用multiprocessing库,多线程调用threading库,python3中multiprocessing的多线程比threading的多线程写法简单多,记录下用法。 提:多线程多进程不是用来炫技的技术、工作中提升效率的选择。多数高计算密集性任务用多进程,高IO密集型任务用多线程。 ## 一、带参数的多线程用发 from multiprocessing.dummy import Pool def test(data): print (data) # #----------

Delphinidae 2047

Python 四种创建多线程的方法

Python默认的解释器,由于全局解释器锁的存在,确实在任意时刻都只有一个线程在执行代码,致使多线程不能充分利用机器多核的特性。如果程序是CPU密集型的,使用Python多线程确实无法提升程序的效率,如果程序是IO密集型的,则可以使用Python的多线程提高程序的整体效率

zhengzaifeidelushang的博客 2263

glibc手动升级高版本导致系统(RedHat/Centos)异常(无法开机等)的解决方法(回退低版本glibc)

我的系统是Redhat7.6, 理论上Redhat7/Centos7都可以使用该方法解决问题。 首先慎重提醒各位:glibc升级会产生无法预料的后果!由于Android NDK需要高版本的glibc才可以使用,所以作死手动去更新了glibc2.18,使得重启系统后图形界面消失。(Redhat/Centos升级此类安装包最好用yum升级,因为系统内的程序对他们的依赖很大,升级会导致大部分程序无法使用...

weixin_42881528的博客 9698

python实现并发的方式_python 实现socket服务端并发的四种方式

python 实现socket服务端并发的四种方式,进程,服务端,线程,多线程,补丁python 实现socket服务端并发的四种方式易采站长站,站长之家为您整理了python 实现socket服务端并发的四种方式的相关内容。多进程&多线程服务端:多进程和多线程的开启方式相同。缺点:<1> 由于Cpython的GIL,导致同一时间无法运行多个线程;<2> 不可能无限...

weixin_39605278的博客 158

SEG-Y 数据介绍及读写

无

1万+

python实现异步socket_python 实现socket服务端并发的四种方式

多进程&多线程服务端:多进程和多线程的开启方式相同。缺点:<1> 由于Cpython的GIL,导致同一时间无法运行多个线程;<2> 不可能无限开进进程或线程解决办法:多进程、concurrent.futures.ProcessPoolExecutor、线程池import socketfrom multiprocessing import Processfrom th...

weixin_39749501的博客 2179

什么是Claude 的 Agent Skills?

摘要: Claude的Agent Skills功能支持通过结构化技能包(含指令、脚本、工具)实现任务自动化,如数据分析、文档生成等。核心能力包括:1)技能包管理(如Python脚本+模板);2)工具调用(API/数据库交互);3)子代理协作(拆分复杂任务)。快速上手步骤:创建技能包(如Excel报表生成)、配置工具权限、触发执行;支持多代理并行处理(如SQL查询+可视化)。关键技巧:工具需明确定义参数、利用子代理共享上下文、注重权限管控。官方文档与社区资源提供进阶指导,使Claude成为可编程的数字助手。

jobleap.cn求职助手首页 1729

二维码扫描与页面跳转的完整流程解析

本文详细解析了二维码扫描与页面跳转的完整流程,从核心原理到前后端实现,涵盖了二维码生成、扫码事件处理、后端验证机制及跳转逻辑等关键环节。特别介绍了如何使用qrcode.js生成二维码、WebSocket处理扫码状态以及JWT令牌验证设计,帮助开发者构建安全高效的扫码跳转系统。

cicd6pipeline的博客 1089

python代码实现ws服务压力测试功能

压测一般使用jmeter这类压测工具,设置并发数量——线程数,请求轮数,最后统计响应是否正确。最近写了个ws服务,同事使用jmeter进行了压测,我也在想怎么自己实现jmeter的压测功能呢?利用python语音和aiohttp客户端以及多进程多线程之类的知识实现了压力测试功能,这里我实现了四种大同小异的方法。整体需求:支持并发数设置,请求轮数,每路并发中请求的间隔以及响应正确率统计。

HUSTHY的博客 1442

IoU的进化之路——IoU、GIoU、DIoU、CIoU四种损失函数总结

IoU、GIoU、DIoU、CIoU四种损失函数总结

chase 8131

python 多线程

方式一: import _thread #---------------_thread实现简单多线程---------------- def run(name): print(name) try: _thread.start_new_thread(run,("AAA",)) _thread.start_new_thread(run,("BBB",)) except: print("无法启动线程") 方式二: import threading #---------------

weixin_47803451的博客 137

AI一键生成带货短视频:电商直播的未来

随着电子商务行业的快速发展,直播带货已成为一种极为有效的营销手段。然而,传统的人工直播方式存在诸多局限性,如人力成本高、主播培训周期长等问题。为了解决这些挑战,一种基于AI技术的一键生成带货视频解决方案应运而生——这就是“Anchor Crafter”。这项创新技术不仅能够自动创建高质量的带货视频,而且还能实现人物与商品之间的自然交互,极大地提升了用户体验。

这里汇聚了前沿的技术分享与实用的开发技巧,带你探索从创意到企业的技术创业之路。 2204

DEA模型及matlab应用3:SBM-DEA 模型

好的产出通常是通过资本、基础设施、劳动力的投入而获得的期望产出,非期望产出的产生,比如碳排放、二氧化硫、粉尘和污水等。 由于经典的 DEA 模型对相对效率的评价要求尽可能的减少投入,增加产出。而我们考虑非期望产出的影响则要尽可能的减少非期望产出才能获得更好的经济效益,与传统 DEA 模型的要求不符。考虑非期望产出的DEA模型是:基于松弛变量的 DEA 模型 SBM(Slacks-based mod...

wjyxld的博客 2万+

Java多线程实现方式全解:从Thread到线程池与FutureTask

并发编程是后端开发的基石,Java通过Thread、Runnable、Callable等接口将任务与线程分离,底层由JVM映射到操作系统原生线程执行。线程创建销毁开销高昂,因此JUC提供了线程池以复用线程,并通过FutureTask/Future机制让异步任务能携带返回值。理解这些实现方式的差异,不仅是面试高频考点,也直接决定项目中的并发设计质量。内容从原理到实践,剖析继承Thread、实现Runnable/Callable、线程池四种写法,重点解释Callable与Runnable的桥接、FutureTa

weixin_34094282的博客 271

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

python多线程与多进程

python中多线程与多进程,有相同点也有异同点。对于相同点而言,其实更多会说的是多任务执行。他们都可以实现多任务执行操作。在多线程和多进程的选择上,需要具体问题具体分析,但是选择的指标还是从资源角度考虑的,如果资源充足的情况下,选那个更多的是还是看算法。所以我们在线程和进程之间犹豫,最大的原因其实还是在资源面前做了一定的妥协。 从资源角度来说,线程包含于进程。一个进程可以创建多个线程,而对于这多个线程而言,其所能分配资源的最大值取决于所在线程所拥有资源大小。所以,从某种意义上来说,如果我们控制一个进程中

qq_44862918的博客 280

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

【Python爬虫实战】从单线程到线程池:掌握三种高效爬虫实现方式

在现代网络爬虫的开发中,性能和效率往往是关键考量因素。无论是初学者还是有经验的开发者,了解不同爬虫实现方式及其优缺点,都是提升爬虫效率的必经之路。本文将深入探讨三种常见的爬虫实现方式:单线程爬虫、多线程爬虫,以及使用线程池的多线程爬虫,并通过详细的代码示例帮助读者掌握如何高效进行网页数据抓取。无论你的目标是爬取少量页面还是大规模数据,本文都将提供有效的解决方案。通过本篇文章,读者不仅能够理解单线程、多线程和线程池爬虫的工作原理,还能够通过具体的代码实例掌握如何在不同场景下选择合适的爬虫策略。

易辰的博客 2143

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

python 多线程与线程池

简单的多线程—使用线程池 from multiprocessing import Pool def f(x): # 基本函数返回 x的平方 return x * x def my_callback(x): # 回调函数,打印x print(x) def multicore(): pool = Pool(4) # 创建可容纳四个进...

红叶谷 wsp_1138886114的博客 4240

Python多线程和线程池的下载实战用法

多线程——IO密集型,例如文件下载多进程——CPU密集型,例如文件读写。

m0_57021623的博客 1965

随笔录--Python多线程和线程池

在一次课设的时候做的随心笔录,现在放在优快云上来记录一下。

Bigbin666的博客 1441

python 线程池用法_python 多线程,线程池的使用。

背景:近期工作需要,要缩短多个程序的运行时间。目标:做到同时运行多个函数,提高效率。方案:查阅资料后,发现可以使用线程,进程,协程来提高效率。(包括线程池,进程池)【一】 多线程【二】 线程池tips:#需要处理列表中的所有数据url_list =[url1,ulr2,-----,url100]工作中需要对一个列表中的所有数据进行处理,直接用多线程的话,一开始数据数对不上,后来拆分成多个列表进...

weixin_34462581的博客 1926
上一篇: windwos11降级,重装Windows10
下一篇: windows10 快捷方式右键失灵问题解决
伏逸
博客等级 码龄7年 20粉丝 14原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值