Python高阶 | 进程与线程

点击上方蓝字关注我们吧

前情回顾

Python基础

Python进阶学习

Python高阶学习

Python高阶 | 正则表达式

3.6进程与线程

截至到现在,大家写的代码都是完成单任务的,那如果我们想让Python同时进行多个任务呢?这就涉及到了进程和线程。这里笔者先科普一波啥是进程与线程。

举个例子,我们在计算机上可以同时运行QQ和微信等多个软件,这些软件就是在一个个进程中运行的。而我们在QQ上即可以聊天也可以看新闻,这就是进程里面一个个线程所做的事。因此,一个进程中至少拥有一个线程。

不过,多线程和多进程一样,都是统一由操作系统在线程中快速切换,切换速度比人类肉眼可见速度快,造成好像多个任务同时运行的假象。但是如果我们的操作系统拥有多个CPU,就可以让多任务同时进行,可以让每个CPU都运行一个进程即可。

3.6.1  多进程的例子

进程池Pool,这里笔者用进程池举例,进程池的默认参数是CPU核数目。

当然,互联网上也有很多别的多进程使用方法,思想都是一样的,只是实现方式不同,大家也可以选择自己喜欢的方式去实现。

参数设置成4,代表同时进行4个进程,第5个进程要等前面4个进程中的某个进程结束才能开始执行。

1.  from multiprocessing import Pool  
2.  import time, random  
3.    
4.  def random_time_task(name):  
5.      print('执行任务 %s ...' % (name))  
6.      start_time= time.time()  
7.      time.sleep(random.random() * 5)  
8.      end_time = time.time()  
9.      print('任务 %s 执行时间:%0.2f s.' % (name, (end_time - start_time)))  
10.    
11.  if __name__=='__main__':  
12.      p = Pool(4)  
13.      for i in range(5):  
14.          p.apply_async(random_time_task, args=(i,))  
15.      p.close()  # 调用close保证所有进程结束后,不再进入新的进程  
16.      p.join()  
17.      print('所有进程完成!')

执行任务 0 ...

执行任务 1 ...

执行任务 2 ...

执行任务 3 ...

任务 1 执行时间:0.67 s.

执行任务 4 ...

任务 3 执行时间:2.45 s.

任务 2 执行时间:2.78 s.

任务 0 执行时间:3.29 s.

任务 4 执行时间:3.49 s.

所有进程完成!

3.6.2  多线程例子

线程和进程之间还是存在一定区别的,每一个进程的变量都是独一无二的,类似QQ和微博,两者独立运行互不影响。

但是同一个进程内的线程是共享同一套变量的,类似我们同时取钱,第一个线程取完了所有的钱,第二个线程就不能再取钱了,因为已经没钱了。

因此,为了避免我们程序出现Bug,我们需要引入Lock锁机制,保证线程间在操作过程中,不能同时对同一变量进行操作。

1.  import threading  
2.  balance = 10  # 银行余额  
3.  lock = threading.Lock()  
4.    
5.  def operation2balance(money):   
6.      global balance  # 全局变量  
7.      balance = balance + money    
8.      balance = balance - money  
9.    
10.  def new_thread(n):  
11.      for i in range(20):  
12.          # 操作前先获得锁  
13.          lock.acquire()  
14.          try:  
15.              operation2balance(n)  
16.          finally:  
17.              # 操作后释放锁  
18.              lock.release()  
19.    
20.  # 启动两个线程  
21.  t1 = threading.Thread(target=new_thread, args=(29,))  
22.  t2 = threading.Thread(target=new_thread, args=(18,))  
23.  t1.start()  
24.  t2.start()  
25.  t1.join()  
26.  t2.join()  
27.  print(balance)

10

3.7 小结

当然,Python能做的事不止这些,我们可以用Python写网页后台,也可以用它来操作数据库等等。所以有些读者可能会疑惑为啥笔者没有给大家把Python的更多细节说清楚。在这里笔者首先声明不是偷懒,原因有四,待我细细诉说。

第一,目前阶段的编程学习已经能完全应付这个系列的课程了,没有必要深入把目前用不着的知识给大家灌输一遍,没有实战,灌输再多边边角角的知识也只是走马观花,很难融会贯通。

第二,笔者已经帮助大家建立好了Python最基本知识体系,它犹如大树的枝干,而其他的知识犹如枝叶,枝叶会在这颗枝干下不断衍生。

那么衍生枝叶所需要的养分呢?那就是你接下来碰到的一个个需要解决的项目,我们在掌握最基本的知识的情况下,通过实战去磨砺我们对所学知识的运用,最终量变决定质变。

第三,网上的知识已经过于冗余,笔者要给大家做减法,而建立一个知识体系就是给大家做减法。

有时候我们只需要知道某个东西能解决哪些问题,例如pandas或者numpy这两个包可以解决很多很多的问题,但是你目前用不着,讲再多也是徒劳,不过我们知道它们的强大,那就在我们需要它们的时候,利用互联网去搜索即可,互联网上总会有人碰到和你一样的问题,并有人已经提供了答案。

第四,一切的项目都是从最基本的语法出发的,它们是万丈高楼的基石,我们想砌什么样的楼房不是看砖头长什么样,而是看设计图长什么样。同样的砖头在不同的图纸下,就会砌出不同的形状的楼房。同样的语法,在不同的学习路线下,就细分出不同的专业领域。

此时,我们回到最开始的问题,Python确实可以做很多的事,但是都是从最基本的知识点出发,至于接下来大家是想从事数据挖掘,还是人工智能,亦或者是网页开发,甚至是爬虫工程师,那就看大家接下来的学习路线了。

现在互联网上有很多学习资源,大家一定要学会使用搜索引擎,遇事不决先搜索,这也是锻炼自己的学习能力。学会规划学习路线和善用搜索引擎才是成长的关键所在。

最后,我们要始终铭记,编程只是工具,并不需要很聪明的脑瓜子,也不需要太多的奇技淫巧,无他,唯熟尔。上述所说不仅仅适用于编程的学习,也是我们应对当下互联网信息大爆炸时代下的有效学习途径。

下一期,我们将介绍

进程与线程

敬请期待~

 

关注我的微信公众号~不定期更新相关专业知识~

内容 |阿力阿哩哩 

编辑 | 阿璃 

点个“在看”,作者高产似那啥~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值