线程 Python,python中进程

  线程 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()来阻塞,t1t2两个线程同时执行,由于位置关系先打印hello,再打印hi,这个时候都sleep2秒钟,但是它sleep2秒钟,主程序还是在执行,所以下面打印print('主线程完毕'),最后才打印ByeOUT

  

线程间变量的共享

在多线程中,所有变量对于所有线程都是共享的,因此,线程之间共享数据的最大危险在于多个线程同时修改一个变量,那就乱套了,所以我们需要互斥锁,来锁住数据。

  代码如上图所示,上面代码中打印的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),就是遍历了1000000incrdecr的方法都加上一起了,在这1000000次遍历中,不知道有多少加,多少减,比如,我1000000都是加,没有减,a就是1000000,但是这种情况的概率很低。

  如果你就是想出现0,其实只需要加一个互斥锁就可以了。这样你加多少次,我就减多少次,加减的次数不会叠加。因此来了lock的用法,具体代码如下图所示。

  这个a怎么运行都是 0。因为我们把这个a锁上了,这样就加1000000次,减1000000次,怎么出来都是我们的0。

  

相关免费学习推荐:python视频教程

  

以上就是深入理解上篇之 Python的进程和线程的详细内容,更多请关注盛行IT软件开发工作室其它相关文章!

  

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: