python线程池多少(2023年最新解答)

作者&投稿:雷贫 (若有异议请与网页底部的电邮联系)
~

导读:本篇文章首席CTO笔记来给大家介绍有关python线程池多少的相关内容,希望对大家有所帮助,一起来看看吧。

Python多线程总结

在实际处理数据时,因系统内存有限,我们不可能一次把所有数据都导出进行操作,所以需要批量导出依次操作。为了加快运行,我们会采用多线程的方法进行数据处理,以下为我总结的多线程批量处理数据的模板:

主要分为三大部分:

共分4部分对多线程的内容进行总结。

先为大家介绍线程的相关概念:

在飞车程序中,如果没有多线程,我们就不能一边听歌一边玩飞车,听歌与玩游戏不能并行;在使用多线程后,我们就可以在玩游戏的同时听背景音乐。在这个例子中启动飞车程序就是一个进程,玩游戏和听音乐是两个线程。

Python提供了threading模块来实现多线程:

因为新建线程系统需要分配资源、终止线程系统需要回收资源,所以如果可以重用线程,则可以减去新建/终止的开销以提升性能。同时,使用线程池的语法比自己新建线程执行线程更加简洁。

Python为我们提供了ThreadPoolExecutor来实现线程池,此线程池默认子线程守护。它的适应场景为突发性大量请求或需要大量线程完成任务,但实际任务处理时间较短。

其中max_workers为线程池中的线程个数,常用的遍历方法有map和submit+as_completed。根据业务场景的不同,若我们需要输出结果按遍历顺序返回,我们就用map方法,若想谁先完成就返回谁,我们就用submit+as_complete方法。

我们把一个时间段内只允许一个线程使用的资源称为临界资源,对临界资源的访问,必须互斥的进行。互斥,也称间接制约关系。线程互斥指当一个线程访问某临界资源时,另一个想要访问该临界资源的线程必须等待。当前访问临界资源的线程访问结束,释放该资源之后,另一个线程才能去访问临界资源。锁的功能就是实现线程互斥。

我把线程互斥比作厕所包间上大号的过程,因为包间里只有一个坑,所以只允许一个人进行大号。当第一个人要上厕所时,会将门上上锁,这时如果第二个人也想大号,那就必须等第一个人上完,将锁解开后才能进行,在这期间第二个人就只能在门外等着。这个过程与代码中使用锁的原理如出一辙,这里的坑就是临界资源。Python的threading模块引入了锁。threading模块提供了Lock类,它有如下方法加锁和释放锁:

我们会发现这个程序只会打印“第一道锁”,而且程序既没有终止,也没有继续运行。这是因为Lock锁在同一线程内第一次加锁之后还没有释放时,就进行了第二次acquire请求,导致无法执行release,所以锁永远无法释放,这就是死锁。如果我们使用RLock就能正常运行,不会发生死锁的状态。

在主线程中定义Lock锁,然后上锁,再创建一个子线程t运行main函数释放锁,结果正常输出,说明主线程上的锁,可由子线程解锁。

如果把上面的锁改为RLock则报错。在实际中设计程序时,我们会将每个功能分别封装成一个函数,每个函数中都可能会有临界区域,所以就需要用到RLock。

一句话总结就是Lock不能套娃,RLock可以套娃;Lock可以由其他线程中的锁进行操作,RLock只能由本线程进行操作。

python线程池的使用

最近在做一个爬虫相关的项目,单线程的整站爬虫,耗时真的不是一般的巨大,运行一次也是心累,,,所以,要想实现整站爬虫,多线程是不可避免的,那么python多线程又应该怎样实现呢?这里主要要几个问题(关于python多线程的GIL问题就不再说了,网上太多了)。

一、既然多线程可以缩短程序运行时间,那么,是不是线程数量越多越好呢?

显然,并不是,每一个线程的从生成到消亡也是需要时间和资源的,太多的线程会占用过多的系统资源(内存开销,cpu开销),而且生成太多的线程时间也是可观的,很可能会得不偿失,这里给出一个最佳线程数量的计算方式:

最佳线程数的获取:

1、通过用户慢慢递增来进行性能压测,观察QPS(即每秒的响应请求数,也即是最大吞吐能力。),响应时间

2、根据公式计算:服务器端最佳线程数量=((线程等待时间+线程cpu时间)/线程cpu时间)*cpu数量

3、单用户压测,查看CPU的消耗,然后直接乘以百分比,再进行压测,一般这个值的附近应该就是最佳线程数量。

二、为什么要使用线程池?

对于任务数量不断增加的程序,每有一个任务就生成一个线程,最终会导致线程数量的失控,例如,整站爬虫,假设初始只有一个链接a,那么,这个时候只启动一个线程,运行之后,得到这个链接对应页面上的b,c,d,,,等等新的链接,作为新任务,这个时候,就要为这些新的链接生成新的线程,线程数量暴涨。在之后的运行中,线程数量还会不停的增加,完全无法控制。所以,对于任务数量不端增加的程序,固定线程数量的线程池是必要的。

三、如何使用线程池

过去使用threadpool模块,现在一般使用concurrent.futures模块,这个模块是python3中自带的模块,但是,python2.7以上版本也可以安装使用,具体使用方式如下:

注意到:

concurrent.futures.ThreadPoolExecutor,在提交任务的时候,有两种方式,一种是submit()函数,另一种是map()函数,两者的主要区别在于:

python中设置线程池最大数量不管用

使用线程池可以有效地控制系统中并发线程的数量。当系统中包含有大量的并发线程时,会导致系统性能急剧下降,甚至导致Python解释器崩溃,而线程池的最大线程数参数可以控制系统中并发线程的数量不超过此数。

结语:以上就是首席CTO笔记为大家整理的关于python线程池多少的全部内容了,感谢您花时间阅读本站内容,希望对您有所帮助,更多关于python线程池多少的相关内容别忘了在本站进行查找喔。




idle多线程不自动关闭
对于idle多线程不自动关闭的原因,一般来说有以下几个方面的考虑:1. 线程生命周期管理:在编写多线程程序时,我们需要明确线程的生命周期,包括启动、执行和结束。在idle中,由于我们通常是交互式地编写和执行代码,所以并没有明确的结束线程的指令。因此,即使某个线程的任务完成了,它也不会自动关闭。2...

python线程池ThreadPoolExecutor.submit的数据丢失问题
ThreadPoolExecutor 是 Executor 的子类,它使用线程池来异步执行调用。关于concurrent.futures模块下的ThreadPoolExecutor类 在使用submit的时候,如果参数传进去的是生成器对象,在某些情况下,生成器对象会被消耗掉一部分或者是全部的数据 以上示例中,尝试二部分是正常且保证是没有问题 而...

python多进程为什么不执行直接跳过
在进行视频取帧的过程中,为了加速,用process多进程同时去做,将取到的帧放到队列中,之后会同时有另外的进程同时进行处理。但是在实际的操作中发现,直接将队列放到参数的位置,所放到进程池中的子线程是不会运行的。于是上网查找了一些资料,发现要用Manager来管理multiprocessing.Queue,这样线程池中的子...

Python ThreadPoolExecutor 异常中止解决方案
适用于 Django 等 WEB 应用框架,本身自带多线程,修改全局变量简单,但要注意线程安全。程序运行中,只需 sign = 1 或者 exiting.set() ,worker 函数则跳过主要运算部分,剩余线程任务将迅速完成,变相达到中止多线程任务的目的。提交给线程池的每个线程任务 task 加入 threadPool 中...

为什么我又从 Node.js 回到 Python
(1)系统线程模型:这种模型的问题显而易见,服务端只有一个线程,并发请求(用户)到达只能处理一个,其余的要先等待,这就是阻塞,正在享受服务的请求阻塞后面的请求了。(2)多线程、线程池模型:这个模型已经比上一个有所进步,它调节服务端线程的数量来提高对并发请求的接收和响应,但并发量高的时候,请求仍然需要等待,...

毕业生必看Python爬虫上手技巧
encoding头信息告诉服务器你能接受gzip压缩数据。然后就是解压缩数据:7、多线程并发抓取 单线程太慢的话,就需要多线程了,这里给个简单的线程池模板 这个程序只是简单地打印了1-10,但是可以看出是并发的。虽然说Python的多线程很鸡肋, 但是对于爬虫这种网络频繁型 ,还是能一定程度提高效率的。

Python实现进程的唤醒与休眠
通过将worker进程启动,主进程即可控制它们的运行。为了进一步优化,可以使用FastAPI框架创建路由接口,允许外部请求触发指定worker进程的执行,实现进程的动态调度。类似的策略同样适用于多线程环境。通过线程池或手动控制线程的启动与停止,实现任务的灵活分配,从而在多线程编程中达到资源优化与效率提升的目标。

浅谈Python之全局解释器锁GIL对线程安全的影响
理解了GIL的作用后,我分析了“urllib.request”模块的多线程安全性。对于使用线程池的下载操作,由于urlopen接口的操作通常是原子的,因此在多数情况下是线程安全的。然而,在初始化全局变量时,需注意线程安全问题,以避免多个线程同时对同一全局变量进行修改。同样,使用list的append操作时,尽管其本身是原子...

django怎么多线程隔离(2023年最新整理)
导读:今天首席CTO笔记来给各位分享关于django怎么多线程隔离的相关内容,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!django使用全局线程池系统里面有频繁的异步操作,每次触发异步操作就会开始一个新的线程处理相关逻辑,逻辑集中在I\/O密集型;频繁的新建\/销毁线程,消耗大量资源;由此,...

使用Java构造高可扩展应用
一种更加合理的使用多线程的方法是使用线程池(Thread Pool) ncurrent 提供了一个灵活的线程池实现 Executor 框架 这个框架可以用于异步任务执行 而且支持很多不同类型的任务执行策略 它还为任务提交和任务执行之间的解耦提供了标准的方法 为使用 Runnable 描述任务提供了通用的方式 Executor 的实现还提供了对生命周期的...

始兴县17087278522: 常见线程池类型有哪些 -
仲孙是慢肝: 下面给你介绍几种常用的线程池32313133353236313431303231363533e4b893e5b19e31333365646339:1、newCachedThreadPool 创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程. ...

始兴县17087278522: python中如何创建并开启一个线程? -
仲孙是慢肝: 使用线程池:threadpool 模块.这是一个第三方模块,可以通过下面方法安装: easy_install threadpool

始兴县17087278522: 为什么在Python里推荐使用多进程而不是多线程 -
仲孙是慢肝: 1、GIL是什么?GIL的全称是Global Interpreter Lock(全局解释器锁),来源是python设计之初的考虑,为了数据安全所做的决定. 2、每个CPU在同一时间只能执行一个线程(在单核CPU下的多线程其实都只是并发,不是并行,并发和并行从...

始兴县17087278522: python 多线程与多进程问题? -
仲孙是慢肝: 监控一个信号就起一个线程与进程处理.这样的逻辑是不太合适的.所有的资源都是有限的,如果这样浪费很快会资源管理失控.常规的做法是起一个线程池,或者是进程池. 使用线程还是进程取决于你处理的信号的类型.如果计算量大,则...

始兴县17087278522: android 异步多少种方式 -
仲孙是慢肝: 异步处理的一种方式AsyncTask,其实它的本质是一个线程池,所有提交的异步任务都会在这个线程池中的工作线程内执行,当工作线程需要跟UI线程交互时,工作线程会通过向在UI线程创建的Handler传...

始兴县17087278522: python3.5怎样控制线程的数量 -
仲孙是慢肝: pool = threadpool.ThreadPool(poolSize)poolSize这里来控制线程数量 有线程池就可以控制

始兴县17087278522: python的multiprocessing到底怎么用的问题 -
仲孙是慢肝: 众所周知,由于python(Cpython)的全局锁(GIL)问题存在,导致Thread也就是线程的并行并不可实现. multiprocessing 模块采用多进程而不是多线程的方式实现并行,解决了GIL的问题,一定程度上使状况得到了缓解.然而,Multiprocess本身依...

始兴县17087278522: 线程池是什么意思 -
仲孙是慢肝: 楼主这是搜狗百科的解释,具体可查看:http://baike.sogou.com/v51776510.htm?fromTitle=%E7%BA%BF%E7%A8%8B%E6%B1%A0 线程池是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任...

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网