线程(thread和threading)
多进程(mutilprocess)
多线程几乎是每一个程序猿在使用每一种语言时都会首先想到用于解决并发的工具(js程序员请回避),使用多线程可以有效的利用cpu资源(python例外)。然而多线程所带来的程序的复杂度也不可避免,尤其是对竞争资源的同步问题。
然而在python中由于使用了全局解释锁(gil)的原因,代码并不能同时在多核上并发的运行,也就是说,python的多线程不能并发,很多人会发现使用多线程来改进自己的python代码后,程序的运行效率却下降了,这是多么蛋疼的一件事呀!实际上使用多线程的编程模型是很困难的,程序员很容易犯错,这并不是程序员的错误,因为并行思维是反人类的,我们大多数人的思维是串行(精神分裂不讨论),而且冯诺依曼设计的计算机架构也是以顺序执行为基础的。所以如果你总是不能把你的多线程程序搞定,恭喜你,你是个思维正常的程序猿:)
多线程
多线程其实可以简单的理解为:在你听着音乐的时候,后台还下载着电影,屏幕上放着小说,你还吃着火锅。现在科技不停的发展,时代在不停的进步,我们的cpu也越来越快,现在cpu开始抱怨了,多大点事儿,就占用了我这么长时间?其实我同时干多个活都没问题的;于是,操作系统就进入了多任务时代。
而python中有两个模块可以来实现多线程,那就是thread和threading,前者提供了低级别的、原始的线程以及一个简单的锁,后者除了提供了前者所有的服务以外还添加了新的东西,这个我们在下面会自己详解。但是现在,thread模块已被废弃。用户可以使用threading模块代替。所以,在python3中不能再使用thread模块了。为了兼容性,python3将 thread重命名为 _thread。
_thread模块的使用,这里的进程ctrl+c终止进程
threading模块的使用,threading模块在thread模块的基础上又添加了一下功能;这里的进程ctrl+c终止进程
threading.currentthread(): 返回当前的线程变量。
threading.enumerate(): 返回一个包含正在运行的线程的list。正在运行指线程启动后、结束前,不包括启动前和终止后的线程。
threading.activecount(): 返回正在运行的线程数量,与len(threading.enumerate())有相同的结果。
现在线程多了,但是没有秩序,是不是不太好啊?就像你上学的时候排队,个子高的站后面,个子低的站前面,我们做一个优先的队列啊~那这个时候我们就需要一个模块queue
queue 模块
queue模块中提供了同步的、线程安全的队列类,包括fifo(先入先出)队列fifoqueue,lifo(后入先出)队列lifoqueue,和优先级队列 priorityqueue。
多进程mutilprocess
像线程一样管理进程,这个是mutilprocess的核心,他与threading很是相像,对多核cpu的利用率会比threading好的多。
创建简单的进程
确定了当前的进程以后,就是给进程命名,目的是方便标识区分,跟踪
之后就是不阻挡主程序退出,自己干自己的,这个就是守护进程
之后就是终止进程,最好使用的poison pill,强制的话使用terminate()