python最多创建多少个线程(2023年最新整理)

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

导读:今天首席CTO笔记来给各位分享关于python最多创建多少个线程的相关内容,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

python最大支持多少线程?

那啥,python线程太慢了,想并发去用greenlet吧,快,写起来还方便。

如果加锁同步的话,线程多了反而变慢也有可能。

ulimit-s返回线程栈大小,我的默认是8192,用内存大小除以它就得到理论上的线程数吧。

python创建多少个线程得到最优的执行效率?

python因为有GIL全局解释器锁,所以python的多线程不能利用多核,但是如果是io密集型的项目,多线程效率也很好,我就是用多线程来做爬虫的。

Python面试题,线程与进程的区别,Python中如何创建多线程?

进程和线程

这两个概念属于操作系统,我们经常听说,但是可能很少有人会细究它们的含义。对于工程师而言,两者的定义和区别还是很有必要了解清楚的。

首先说进程,进程可以看成是CPU执行的具体的任务。在操作系统当中,由于CPU的运行速度非常快,要比计算机当中的其他设备要快得多。比如内存、磁盘等等,所以如果CPU一次只执行一个任务,那么会导致CPU大量时间在等待这些设备,这样操作效率很低。为了提升计算机的运行效率,把机器的技能尽可能压榨出来,CPU是轮询工作的。也就是说它一次只执行一个任务,执行一小段碎片时间之后立即切换,去执行其他任务。

所以在早期的单核机器的时候,看起来电脑也是并发工作的。我们可以一边听歌一边上网,也不会觉得卡顿。但实际上,这是CPU轮询的结果。在这个例子当中,听歌的软件和上网的软件对于CPU而言都是独立的进程。我们可以把进程简单地理解成运行的应用,比如在安卓手机里面,一个app启动的时候就会对应系统中的一个进程。当然这种说法不完全准确,一个应用也是可以启动多个进程的。

进程是对应CPU而言的,线程则更多针对的是程序。即使是CPU在执行当前进程的时候,程序运行的任务其实也是有分工的。举个例子,比如听歌软件当中,我们需要显示歌词的字幕,需要播放声音,需要监听用户的行为,比如是否发生了切歌、调节音量等等。所以,我们需要进一步拆分CPU的工作,让它在执行当前进程的时候,继续通过轮询的方式来同时做多件事情。

进程中的任务就是线程,所以从这点上来说,进程和线程是包含关系。一个进程当中可以包含多个线程,对于CPU而言,不能直接执行线程,一个线程一定属于一个进程。所以我们知道,CPU进程切换切换的是执行的应用程序或者是软件,而进程内部的线程切换,切换的是软件当中具体的执行任务。

关于进程和线程有一个经典的模型可以说明它们之间的关系,假设CPU是一家工厂,工厂当中有多个车间。不同的车间对应不同的生产任务,有的车间生产汽车轮胎,有的车间生产汽车骨架。但是工厂的电力是有限的,同时只能满足一个厂房的使用。

为了让大家的进度协调,所以工厂需要轮流提供各个车间的供电。这里的车间对应的就是进程。

一个车间虽然只生产一种产品,但是其中的工序却不止一个。一个车间可能会有好几条流水线,具体的生产任务其实是流水线完成的,每一条流水线对应一个具体执行的任务。但是同样的,车间同一时刻也只能执行一条流水线,所以我们需要车间在这些流水线之间切换供电,让各个流水线生产进度统一。

这里车间里的流水线自然对应的就是线程的概念,这个模型很好地诠释了CPU、进程和线程之间的关系。实际的原理也的确如此,不过CPU中的情况要比现实中的车间复杂得多。因为对于进程和CPU来说,它们面临的局面都是实时变化的。车间当中的流水线是x个,下一刻可能就成了y个。

了解完了线程和进程的概念之后,对于理解电脑的配置也有帮助。比如我们买电脑,经常会碰到一个术语,就是这个电脑的CPU是某某核某某线程的。比如我当年买的第一台笔记本是4核8线程的,这其实是在说这台电脑的CPU有4个计算核心,但是使用了超线程技术,使得可以把一个物理核心模拟成两个逻辑核心。相当于我们可以用4个核心同时执行8个线程,相当于8个核心同时执行,但其实有4个核心是模拟出来的虚拟核心。

有一个问题是为什么是4核8线程而不是4核8进程呢?因为CPU并不会直接执行进程,而是执行的是进程当中的某一个线程。就好像车间并不能直接生产零件,只有流水线才能生产零件。车间负责的更多是资源的调配,所以教科书里有一句非常经典的话来诠释:进程是资源分配的最小单元,线程是CPU调度的最小单元。

启动线程

Python当中为我们提供了完善的threading库,通过它,我们可以非常方便地创建线程来执行多线程。

首先,我们引入threading中的Thread,这是一个线程的类,我们可以通过创建一个线程的实例来执行多线程。

fromthreadingimportThreadt=Thread(target=func,name='therad',args=(x,y))t.start()

简单解释一下它的用法,我们传入了三个参数,分别是target,name和args,从名字上我们就可以猜测出它们的含义。首先是target,它传入的是一个方法,也就是我们希望多线程执行的方法。name是我们为这个新创建的线程起的名字,这个参数可以省略,如果省略的话,系统会为它起一个系统名。当我们执行Python的时候启动的线程名叫MainThread,通过线程的名字我们可以做区分。args是会传递给target这个函数的参数。

我们来举个经典的例子:

importtime,threading#新线程执行的代码:defloop(n):print('thread%sisrunning...'%threading.current_thread().name)foriinrange(n):print('thread%s%s'%(threading.current_thread().name,i))time.sleep(5)print('thread%sended.'%threading.current_thread().name)print('thread%sisrunning...'%threading.current_thread().name)t=threading.Thread(target=loop,name='LoopThread',args=(10,))t.start()print('thread%sended.'%threading.current_thread().name)

我们创建了一个非常简单的loop函数,用来执行一个循环来打印数字,我们每次打印一个数字之后这个线程会睡眠5秒钟,所以我们看到的结果应该是每过5秒钟屏幕上多出一行数字。

我们在Jupyter里执行一下:

表面上看这个结果没毛病,但是其实有一个问题,什么问题呢?输出的顺序不太对,为什么我们在打印了第一个数字0之后,主线程就结束了呢?另外一个问题是,既然主线程已经结束了,为什么Python进程没有结束,还在向外打印结果呢?

因为线程之间是独立的,对于主线程而言,它在执行了t.start()之后,并不会停留,而是会一直往下执行一直到结束。如果我们不希望主线程在这个时候结束,而是阻塞等待子线程运行结束之后再继续运行,我们可以在代码当中加上t.join()这一行来实现这点。

t.start()t.join()print('thread%sended.'%threading.current_thread().name)

join操作可以让主线程在join处挂起等待,直到子线程执行结束之后,再继续往下执行。我们加上了join之后的运行结果是这样的:

这个就是我们预期的样子了,等待子线程执行结束之后再继续。

我们再来看第二个问题,为什么主线程结束的时候,子线程还在继续运行,Python进程没有退出呢?这是因为默认情况下我们创建的都是用户级线程,对于进程而言,会等待所有用户级线程执行结束之后才退出。这里就有了一个问题,那假如我们创建了一个线程尝试从一个接口当中获取数据,由于接口一直没有返回,当前进程岂不是会永远等待下去?

这显然是不合理的,所以为了解决这个问题,我们可以把创建出来的线程设置成守护线程。

守护线程

守护线程即daemon线程,它的英文直译其实是后台驻留程序,所以我们也可以理解成后台线程,这样更方便理解。daemon线程和用户线程级别不同,进程不会主动等待daemon线程的执行,当所有用户级线程执行结束之后即会退出。进程退出时会kill掉所有守护线程。

我们传入daemon=True参数来将创建出来的线程设置成后台线程:

t=threading.Thread(target=loop,name='LoopThread',args=(10,),daemon=True)

这样我们再执行看到的结果就是这样了:

这里有一点需要注意,如果你在jupyter当中运行是看不到这样的结果的。因为jupyter自身是一个进程,对于jupyter当中的cell而言,它一直是有用户级线程存活的,所以进程不会退出。所以想要看到这样的效果,只能通过命令行执行Python文件。

如果我们想要等待这个子线程结束,就必须通过join方法。另外,为了预防子线程锁死一直无法退出的情况,我们还可以在joih当中设置timeout,即最长等待时间,当等待时间到达之后,将不再等待。

比如我在join当中设置的timeout等于5时,屏幕上就只会输出5个数字。

另外,如果没有设置成后台线程的话,设置timeout虽然也有用,但是进程仍然会等待所有子线程结束。所以屏幕上的输出结果会是这样的:

虽然主线程继续往下执行并且结束了,但是子线程仍然一直运行,直到子线程也运行结束。

关于join设置timeout这里有一个坑,如果我们只有一个线程要等待还好,如果有多个线程,我们用一个循环将它们设置等待的话。那么主线程一共会等待N*timeout的时间,这里的N是线程的数量。因为每个线程计算是否超时的开始时间是上一个线程超时结束的时间,它会等待所有线程都超时,才会一起终止它们。

比如我这样创建3个线程:

ths=[]foriinrange(3):t=threading.Thread(target=loop,name='LoopThread'+str(i),args=(10,),daemon=True)ths.append(t)fortinths:t.start()fortinths:t.join(2)

最后屏幕上输出的结果是这样的:

所有线程都存活了6秒。

总结

在今天的文章当中,我们一起简单了解了操作系统当中线程和进程的概念,以及Python当中如何创建一个线程,以及关于创建线程之后的相关使用。

多线程在许多语言当中都是至关重要的,许多场景下必定会使用到多线程。比如web后端,比如爬虫,再比如游戏开发以及其他所有需要涉及开发ui界面的领域。因为凡是涉及到ui,必然会需要一个线程单独渲染页面,另外的线程负责准备数据和执行逻辑。因此,多线程是专业程序员绕不开的一个话题,也是一定要掌握的内容之一。

请问Python如何创建有限线程来处理函数?

使用线程池:threadpool模块。这是一个第三方模块,可以通过下面方法安装:

easy_installthreadpool

请教python线程数量限制的问题

#encoding:utf8??

??

import?threading??

import?time??

??

data?=?0??

??

def?func(sleeptime):??

????global?data??

????print?threading.currentThread().getName()??

????time.sleep(sleeptime)??

threads?=?[]??

??

for?i?in?range(0,40):??

????t?=?threading.Thread(target=func,args=(i,))??

????threads.append(t)??

??

num?=?0??

for?t?in?threads:??

????t.start()??

????while?True:??

????????#判断正在运行的线程数量,如果小于5则退出while循环,??

????????#进入for循环启动新的进程.否则就一直在while循环进入死循环??

????????if(len(threading.enumerate())??5):??

????????????break

结语:以上就是首席CTO笔记为大家介绍的关于python最多创建多少个线程的全部内容了,希望对大家有所帮助,如果你还想了解更多这方面的信息,记得收藏关注本站。




python最多创建多少个线程(2023年最新整理)
车间负责的更多是资源的调配,所以教科书里有一句非常经典的话来诠释:进程是资源分配的最小单元,线程是CPU调度的最小单元。 启动线程 Python当中为我们提供了完善的threading库,通过它,我们可以非常方便地创建线程来执行多线程。 首先,我们引入threading中的Thread,这是一个线程的类,我们可以通过创建一个线程的实例来执...

python单核最多能开多少线程(2023年最新整理)
pythonprocess最多能多少个进程 由于GIL的存在,python中的多线程其实并不是真正的多线程,如果想要充分地使用多核CPU的资源,在python中大部分情况需要使用多进程。 Python提供了非常好用的多进程包multiprocessing,只需要定义一个函数,Python会完成其他所有事情。借助这个包,可以轻松完成从单进程到并发执行的转换。 multipro...

python最多能起多少携程?
ulimit-s返回线程栈大小,我的默认是8192,用内存大小除以它就得到理论上的线程数吧。pythonmultiprocessing最大多少进程最大进程只受操作系统资源限制.不是进程越多越好,程序的速度就越快.一般有几个CPU核心,就开多少进程,或者核心数的N倍.python多线程作用总结起来,使用多线程编程具有如下几个优点:进程...

python最多多少进程(linux最多多少进程)
python进程池最大数量初始化Pool时,可以指定一个最大进程数,当有新的请求提交到Pool中时,如果池还没有满,那么就会创建一个新的进程用来执行该请求;但如果池中的进程数已经达到指定的最大值,那么该请求就会等待,直到池中有进程结束,才会用之前的进程来执行新的任务。pythonmultiprocessing最大多少...

python最多可以多少个不等式
python最多可以装满多少个 32位python的限制是536870912个元素,64位python的限制是1152921504606846975个元素。 最大容量得看机器的性能指标,PyList_New中list并非无穷大,在python源码中规定了list的最大容量PY_SSIZE_T_MAX。 Python最原始的实现是CPython,即用C实现的Python。对于Python中的List元素最多能容纳多少个元...

python进程设置多少最好(2023年最新整理)
Python中的多进程是通过multiprocessing包来实现的,和多线程的threading.Thread差不多,它可以利用multiprocessing.Process对象来创建一个进程对象。这个进程对象的方法和线程对象的方法差不多也有start(),run(),join()等方法,其中有一个方法不同Thread线程对象中的守护线程方法是setDeamon,而Process进程对象的守护进程是通过...

Python通过什么可以创建多个对象?
Python通过类来创建多个对象。类是一种抽象的概念,用于描述一类对象的公共属性和行为。每个类可以创建多个对象,这些对象称为该类的实例。每个实例都是独立的,具有自己的属性和方法。例如,如果你想创建一个表示人的类,你可以定义一个Person类,并定义属性,如名字,年龄,住址等。然后,您可以创建多个...

python多线程并发数最大多少(多线程最大线程数)
主要分为三大部分:共分4部分对多线程的内容进行总结。先为大家介绍线程的相关概念:在飞车程序中,如果没有多线程,我们就不能一边听歌一边玩飞车,听歌与玩游戏不能并行;在使用多线程后,我们就可以在玩游戏的同时听背景音乐。在这个例子中启动飞车程序就是一个进程,玩游戏和听音乐是两个线程。Python...

Python函数最多有多少个参数(python函数最多有多少个参数方程)
Python中查看函数参数有四种方式: 1.F(arg1,arg2,…) 这是最常见的定义方式,一个函数可以定义任意个参数,每个参数间用逗号分割,用这种方式定义的函数在调用的的时候也必须在函数名后的小括号里提供个数相等的值(实际参数),而且顺序必须相同,也就是说在这种调用方式中,形参和实参的个数必须一致,而且必须一一对应...

linux python connect 对同一个端口可以建立多少个
如果按上述端口范围进行设置,则理论上单独一个进程最多可以同时建立60000多个TCP客户端连接。 第二种无法建立TCP连接的原因可能是因为Linux网络内核的IP_TABLE防火墙对最大跟踪的TCP连接数有限制。此时程序会表现为在 connect()调用中阻塞,如同死机,如果用tcpdump工具监视网络,也会发现根本没有TCP连接时客户端发SYN包...

乌当区13152335488: python最大支持多少线程 -
隐谢治君: 如果加锁同步的话,线程多了反而变慢也有可能.ulimit -s 返回线程栈大小,我的默认是8192, 用内存大小除以它就得到理论上的线程数吧.

乌当区13152335488: 为什么有人说 Python 的多线程是鸡肋 -
隐谢治君: 因为python的全局解释器锁(global interpreter lock,gil)强制要求python只能在一个解释器中进行,也就是说即使你有多个处理器,python也只能使用其中的一个,线程实际上是在串行运行.如果只有一个处理器,那么python的线程和其他语言没...

乌当区13152335488: python中什么是线程 -
隐谢治君: 线程是系统中的名词,Python一般是单线程的,Python的多线程优化很差.线程,有时被称为轻量级进程(Lightweight Process,LWP),是程序执行流的最小单元.一个标准的线程由线程ID,当前指令指针(PC),寄存器集合和堆栈组成.另...

乌当区13152335488: 一个进程(Process)最多可以生成多少个线程(Thread) -
隐谢治君: #define MAX_THREADS 50000 #include#includeDWORD WINAPI ThreadProc(LPVOID lpParam){ while(1) { Sleep(100000); } return 0;}int main(){ DWORD dwThreadId[MAX_THREADS]; HANDLE hThread[MAX_THREADS]; void*stack[MAX_...

乌当区13152335488: python py文件同时开两个线程可以吗 -
隐谢治君: 可以的.Python 多线程 多线程类似于同时执行多个不同程序,多线程运行有如下优点:使用线程可以把占据长时间的程序中的任务放到后台去处理.用户界面可以更加吸引人,这样比如用户点击了一个按钮去触发某些事件的处理,可以弹出一...

乌当区13152335488: 线程和进程的区别及Python代码实例 -
隐谢治君: python的脚本让一个进程中运行两个线程:import time import thread def Ordering(interval):cnt = 0while cnt<100:print '好了,你订餐成功,订餐号码是:%d号 订餐时间是:%s 请在旁边耐心等待\n\n'%(cnt, time.ctime())time.sleep(interval)cnt...

乌当区13152335488: python多线程几种方法实现 -
隐谢治君: Python进阶(二十六)-多线程实现同步的四种方式 临界资源即那些一次只能被一个线程访问的资源,典型例子就是打印机,它一次只能被一个程序用来执行打印功能,因为不能多个线程同时操作,而访问这部分资源的代码通常称之为临界区. ...

乌当区13152335488: 一个进程最多能包含多少线程 -
隐谢治君: 以下是对在linux环境下一个进程最多能有多少个线程进行了介绍,需要的朋友可以过来参考下 默认情况下: 主线程+辅助线程 +<253个自己的线程<=255 含主线程和一个辅助线程,最多255个,即你自己只能生成253个线程. 据说可以设置线程数目: 据说是可以设置的,但本人还没有验证!不知道可否. 在你的shell中键入limit命令,里面有descriptor的数目,就是你的进程可以创建的最大线程数目.可以通过修改内核文件更改该数目.

乌当区13152335488: python 怎么对多个线程进行控制 -
隐谢治君: 一般来说,多线程模式下,建议主线程只处理线程本身的调度,不去处理具体业务.通常在创建线程后,join等待所有线程退出. 就题主的问题,可以创建线程一、二之后,主线程等待线程一退出,之后用sys.exit退出.

乌当区13152335488: python多进程中同一时间到底有几个线程在运行 -
隐谢治君: 由于GIL锁的原因,python的多线程在同一时间同一个进程中,只有一个线程在运行.

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