简介:今天,首席执行官指出,要与您分享多少个与Python有关的线程。如果您可以解决您现在面临的问题,请不要忘记注意此网站。让我们现在开始!
什么,Python线程太慢,想使用Greenlet,快速,很方便编写。
如果锁同步,则可以减慢线程。
ulimit -s返回线程堆栈的大小,我的默认值为8192,并且通过删除内存的大小来获得线程的理论数。
由于Python具有GIL全球解释器锁,Python的多线多核心,但是如果它是一个IO -dense项目,那么多线程效率也非常好。我使用多线程来制作爬网。
过程和线程
这两个概念属于操作系统。我们经常听到,但很少有人可以研究其含义。对于工程师,仍然有必要理解两者之间的定义和差异。
首先,该过程可以被视为CPU执行的特定任务。在操作系统中,由于CPU非常快,因此比计算机中的其他设备快得多。例如,内存,磁盘等,如果CPU一次仅执行一项任务,则会导致CPU等待这些设备很多,因此操作效率非常低。为了提高计算机的运行效率,机器的技能被挤压了尽可能出去。CPU是查询。换句话说,它一次只执行一个任务,并且在执行一小块片段以执行其他任务后立即切换。
因此,在早期的单眼机器中,计算机似乎也可以同时使用。我们可以在听这首歌时浏览互联网,而且我们不会感到口吃。但实际上,这是CPU旋转的结果。在此示例中,聆听歌曲和Internet软件的软件是CPU的独立过程。我们可以简单地了解操作过程。例如,在Android手机中,一个过程将与应用程序启动时的过程相对应。当然,此语句不是完全准确的,并且一个应用程序也可以启动多个进程。
该过程与CPU相对应,线程更针对程序。,我们需要显示歌词的字幕,戏剧的声音和用户的行为,例如是否剪裁歌曲,调整音量等等。因此,我们需要进一步分开CPU,因此在执行当前过程时,它将继续通过旋转同时执行多件事。
该过程中的任务是线程,因此从这个角度来看,过程和线程包括一个关系。一个过程可以包含多个线程。对于CPU,无法直接执行该线程,并且线程必须属于进程。因此,我们知道CPU进程开关转到Switch是执行的应用程序或软件,并且该过程内部的线程切换是特定的执行软件中的任务。
关于过程和线程的经典模型可以解释它们之间的关系。假设CPU是工厂,工厂中有多个研讨会。不同的讲习班对应于不同的生产任务。一些研讨会生产汽车轮胎,有些研讨会产生了汽车骨架。但是,工厂的力量有限,只能满足工厂建筑的使用。
为了使每个人的进度取得进展,工厂需要轮流在每个研讨会中提供电源。这里的研讨会与该过程相对应。
尽管研讨会仅生产一种产品,但有一个以上的过程。车间中可能有几个装配线。特定的生产任务实际上由组装线完成。每条装配线都对应于特定的任务。但是,与此同时,研讨会只能同时执行装配线,因此我们需要研讨会在这些装配线之间切换,并让每个组件统一的生产进度。
车间中的流线自然对应于线程的概念。该模型解释了CPU,过程和线程之间的关系。实际原理确实是相同的,但是CPU中的情况比现实中的研讨会要复杂得多。由于流程和CPU,他们面临的情况在真实的情况下发生了变化。时间。研讨会中的流线为X,下一刻可能变成Y。
在理解线程和过程的概念之后,了解计算机的配置也很有帮助。例如,当我们购买计算机时,我们经常遇到一个术语,也就是说,该计算机的CPU来自某个核和某些线程。例如,我那年购买的第一个笔记本是4个核心和8个线程。这实际上是该计算机的CPU具有4个计算核心,但是上行技术的使用可以将物理核模拟为两个逻辑。同一时间,但实际上4个内核是虚拟核心模拟。
一个问题是为什么它是4个核和8个线程,而不是4个核心和8个进程?因为CPU不直接执行该过程,而是在过程中执行某个线程。直接,只有装配线才能产生零件。研讨会更负责资源的部署,因此教科书中有一个非常经典的单词要解释:该过程是资源分配的最小单位,线程是最小的。CPU调度单位。
启动线程
Python为我们提供了一个完整的线程库。通过它,我们可以轻松地创建线程以执行多线程。
首先,我们在线程中介绍线程,这是线程类。我们可以通过创建线程实例来执行多线程。
从线程导入线程t =线程(target = func,name ='therad',args =(x,y))t.start()
为了简要解释其用法,我们已将三个参数分为三个参数,即目标,名称和args。从名称来看,我们可以猜测它们的含义。第一个是目标,这是一种引入的方法,即我们想要多线程执行的方法。名称是我们新创建的线程的名称。可以省略此参数。如果省略了,系统将为它设置一个系统名称。当我们执行python时,线程名称为主题,我们可以通过线程名称区分。ARGS是一个将传递到目标函数的参数。
让我们举一个经典的例子:
导入时间,线程#新线程执行代码:def loop(n):print('thread%s正在运行...'%three.current_thread()。名称):%s%s'%(threading.current.current_thread())。t = threading.thread(target = looop,name ='loopthread',args =(10,))print('thread%s结束。'%螺纹.current_thread()。名称)
我们创建了一个非常简单的循环函数来执行一个循环以打印数字。每次打印一个数字之后,此线程将睡觉5秒,因此我们看到的结果应每5秒钟超过5秒钟。
让我们在Jupyter中执行它:
从表面上看,这个结果很好,但实际上存在问题。有什么问题?输出的顺序不正确。为什么主要线程打印第一个数字0?另一个问题是,由于主线程已经结束,为什么未结束的Python进程仍在向外打印?
因为线程是独立的,对于主线程,它不会在执行t.start()之后留下操作结束后的子线程,我们可以将T.Join()的线添加到代码中以实现此目标。
t.start()
加入操作允许主线程在加入处挂起,直到继续执行之前的子线程执行结束。我们添加了JOIN运行结果:
这是我们期望的,我们将在执行子线程结束后继续。
让我们再次查看第二个问题。为什么当主线程结束时,子线程继续运行,而Python进程未退出?这是因为我们默认情况下创建了用户 - 级线程。对于进程,它将等待所有用户 - 级线程在执行所有用户 - 级线程后退出。这里有一个问题。如果我们创建一个线程以尝试从接口获取数据,则因为接口尚未返回,当前过程是否会永远等待?
这显然是不合理的,因此为了解决此问题,我们可以将创建的线程设置为守卫线程。
监护人线
监护人线是守护程序线程。它的英语文字翻译实际上是背景中的背景,因此我们也可以理解背景线程,这更方便地理解。DAEMON线程与用户线程级别不同。该过程不会主动等待执行守护程序线程。当所有用户 - 级线程的执行将退出时。
我们传递守护程序= true参数,将创建的线程设置为背景线程:
t = threading.thread(target = looop,name ='loopthread',args =(10,),守护程序= true)
这样,我们再次看到的结果是:
在这里要注意的一件事是,如果您在Jupyter中运行,您将看不到这样的结果。因为Jupyter本身就是一个过程,对于Jupyter中的单元格,它始终由用户级别的线程生存下来,因此该过程将会不退出。因此,如果您想查看这种效果,则只能通过命令行执行Python文件。
如果我们想等待此子线程结束,我们必须传递加入方法。加上添加,为了防止子线程锁定,我们还可以在joih中设置超时,也就是说,是最长的等待时间,等待时间到达时,我们将不再等待。
例如,当我设置的超时连接等于5时,屏幕上只有5个数字。
此外,如果未设置为背景线程,尽管超时也很有用,但该过程仍将等待所有子线程结束。因此,屏幕上的输出结果将如下:
尽管主线程继续执行并结束,但子线程仍在运行,直到子线程运行为止。
这里有一个关于加入设置的坑。如果我们只有一个线程等待,如果我们有多个线程,我们将使用一个周期来设置它们。每个线程计算的启动时间是在上一个线程的末尾,随着时间的推移,它将等待所有线程暂停,然后它们将它们终止。
例如,我创建了3个线程:
ths = []对于i在范围(3)中的i:t = threading.thread(target = looop,name ='loopthread' + str' + str(i),args =(10,),daemon = true)ths.append(t)对于t t ths:t.start()for t ths in ths:t.join(2)
屏幕上输出的结果是:
所有线程都存活了6秒。
总结
在今天的文章中,我们简要了解操作系统中线程和过程的概念,以及如何在Python中创建线程以及创建线程后相关使用。
多语言中的多线程至关重要,在许多情况下将使用多线程。界面。由于所有这些都涉及UI,因此不可避免地需要一个单独的渲染页面,另一个线程负责准备数据和执行逻辑。因此,Multi -Threading是专业程序员无法解决的主题,并且它是一个主题,并且是一个主题也是必须掌握的内容之一。
使用线程池:threadpool模块。这是可以通过以下方法安装的第三个选项模块:
easy_install threadpool
#encoding:UTF8
导入线程
导入时间
数据= 0
def func(睡眠时间):
全局数据
打印螺纹。currentThread()。getName()
时间。睡眠(睡眠时间)
线程= []
对于我的范围(0,40):
t = threading.thread(target = func,args =(i,))
threads.append(t)
num = 0
对于线程中的t:
t.start()
而真:
#确定运行的线程数(如果少于5)将退出时周期,
#启动新过程。否则,您将在整个循环中输入死周期
if(threading.enumerate())5)::
休息
结论:以上是首席CTO的全部内容指出,关于Python创建了多少个Python的线程。我希望这对每个人都会有所帮助。如果您仍然想了解有关此信息的更多信息,请记住收集并关注此网站。