线程 Python,python中进程
python视频教程栏目介绍进程和线程。
进程和线程都是操作系统中的基本概念。它们之间有一些优点、缺点和差异。那么如何在Python中使用进程和线程呢?
00-1010计算机的核心是CPU,它承担了计算机的所有计算任务。CPU就像一个工厂,无时无刻不在运行,而操作系统管理着电脑,负责任务调度、资源分配和管理。
00-1010进程是指可以在系统中独立运行的资源分配的基本单元。它由一组机器指令、数据和堆栈组成,是一个可以独立运行的活动实体。
当我们打开我们的电脑,我们会看到进程和线程,点击我的电脑,我们可以看到CPU的运行。
如图所示,CPU中运行着190个进程和2620个线程。例如,当我们再次点击QQ并登录另一个帐户时,将启动另一个QQ进程。
所以,如果你想在电脑上登录多个微信。只需找到你的微信快捷方式,右键查看属性,复制目标中的链接;新建一个记事本,取任意名称,双击打开,在里面输入start (注意引号是英文的,前后有空格),把刚刚复制的链接(也就是微信安装的路径)粘贴进去;然后整行复制,想开几个微信就贴几行;保存文件并将其后缀改为bat。双击运行。
00-1010线程,也叫轻量级进程,是操作系统可以调度操作的最小单位。它包含在流程中,是流程中的实际操作单元。
记得阮一峰的博客:假设工厂的电力有限,一次只能供应一个车间。也就是说,一个车间开工,其他所有车间都要停工。背后的含义是单个CPU一次只能运行一个任务。
流程就像工厂里的车间。它代表CPU可以处理的单个任务。在任何时刻,CPU总是运行一个进程,而其他进程处于非运行状态。
线程就像车间里的工人。一个进程可以包含多个线程,它们协作完成一项任务。
总而言之:程序可以包含多个进程,多个进程并发执行,相互独立,因此,进程也是系统进行资源分配和调度基本单位。专业化来说:进程是指程序执行时的一个实例。线程是最小的执行单元,而进程由至少一个线程组成。如何调度进程和线程,完全由操作系统决定。
00-1010现在我们来谈谈Python中线程和进程的使用。
在Python中,两个标准库thread和threading提供了对线程的支持,而threading封装了线程。线程模块提供了线程、锁、r锁、条件等组件。
00-1010 Python中线程和进程的使用是通过Thread类实现的。这个类在我们的_thread和threading模块中。一般来说,我们通过线程导入。
默认情况下,只要它在解释器中,如果没有报告错误,线程就是可用的。
从线程导入线程复制代码下面是Thread类的公共参数描述和示例方法。
让我们看一个官方文档中标准多线程的例子。
导入线程
导入时间
#定义线程要运行的函数
定义函数(名称):
#睡眠2秒钟以便于观察
时间.睡眠(2)
打印(我的名字是%s\t % name )
#创建第一个线程的实例。args参数是一个元组,必须用逗号分隔。
t1=线程。Thread(target=func,args=(Runsen ,))
#创建第二个线程的实例
t2=线程。Thread(target=func,args=(李茂,))
t1.start()
t2.start()
#首先打印线程名称
print(t1.getName())
Print(t2.getName())复制代码由于两个线程同时运行,打印处理的结果不会换行。
我写了下面的代码来加深线程模块的使用。
ar:false"># -*- coding:utf-8 -*-# time :2019/4/9 21:52# author: Runsenimport threadingimport timedef fun1():
print('hello')
time.sleep(2)
print('Bye')def fun2():
print('hi')
time.sleep(2)
print('OUT')
t1 = threading.Thread(target=fun1)
t2 = threading.Thread(target=fun2)
t1.start()
t2.start()# t1.join()# t2.join()print('主线程完毕')复制代码下面是输出结果。
hello我们先不加hi
主线程完毕
Bye
OUT复制代码
join()
来阻塞,t1
和t2
两个线程同时执行,由于位置关系先打印hello
,再打印hi
,这个时候都sleep2秒钟,但是它sleep2秒钟,主程序还是在执行,所以下面打印print('主线程完毕')
,最后才打印Bye
和OUT
。
线程间变量的共享
在多线程中,所有变量对于所有线程都是共享的,因此,线程之间共享数据的最大危险在于多个线程同时修改一个变量,那就乱套了,所以我们需要互斥锁,来锁住数据。代码如上图所示,上面代码中打印的a是1还是2?
答案是:2。因为出现了global
关键字,线程间变量的共享,在func
函数中的a
是全局变量。因此在函数中a的值发生了变化。
下面,我们提高一点点难度,代码如下图所示,还是猜一猜a是啥东西。注意:这里出现了join来阻塞,并且增加了加和减的操作。
相信很多人都认为是0,其实这个a的值是变化的,可能这次是0 ,下次是1,还有可能是1000000
,比如,我可以
a就是在[-1000000,1000000]
中的一个随机数。
为什么呢?这是因为虽然他们是同时运行的,但是同时在修改我们的a,那就乱了。a在for i in range(1000000)
,就是遍历了1000000
,incr
和decr
的方法都加上一起了,在这1000000
次遍历中,不知道有多少加,多少减,比如,我1000000都是加,没有减,a就是1000000,但是这种情况的概率很低。
如果你就是想出现0,其实只需要加一个互斥锁就可以了。这样你加多少次,我就减多少次,加减的次数不会叠加。因此来了lock的用法,具体代码如下图所示。
这个a怎么运行都是 0。因为我们把这个a锁上了,这样就加1000000次,减1000000次,怎么出来都是我们的0。
相关免费学习推荐:python视频教程以上就是深入理解上篇之 Python的进程和线程的详细内容,更多请关注盛行IT软件开发工作室其它相关文章!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。