单线程, 在好些年前的MS-DOS时代,操作系统处理问题都是单任务的,我想做听音乐和看电影两件事儿,那么一定要先排一下顺序。

#coding=utf-8
import threading
from time import ctime,sleepdef music(func):for i in range(2):print "I was listening to %s. %s" %(func,ctime())sleep(1)def movie(func):for i in range(2):print "I was at the %s! %s" %(func,ctime())sleep(5)if __name__ == '__main__':music(u'爱情买卖')movie(u'阿凡达')print "all over %s" %ctime()

一个任务只能等待上一个任务完成,才能执行。是阻塞的。

I was listening to 爱情买卖. Mon Feb 27 16:09:30 2017
I was listening to 爱情买卖. Mon Feb 27 16:09:31 2017
I was at the 阿凡达! Mon Feb 27 16:09:32 2017
I was at the 阿凡达! Mon Feb 27 16:09:37 2017
all over Mon Feb 27 16:09:42 2017

多线程,python提供了两个模块来实现多线程thread 和threading ,thread 有一些缺点,在threading 得到了弥补,为了不浪费你和时间,所以我们直接学习threading 就可以了。

#coding=utf-8
import threading
from time import ctime,sleepdef music(func):for i in range(2):print "I was listening to %s. %s" %(func,ctime())sleep(1)def movie(func):for i in range(2):print "I was at the %s! %s" %(func,ctime())sleep(5)threads = []
t1 = threading.Thread(target=music,args=(u'爱情买卖',))
threads.append(t1)
t2 = threading.Thread(target=movie,args=(u'阿凡达',))
threads.append(t2)if __name__ == '__main__':for t in threads:# setDaemon(True)将线程声明为守护线程,必须在start() 方法调用之前设置,如果不设置为守护线程程序会被无限挂起。子线程启动后,父线程也继续执行下去,当父线程执行完最后一条语句print "all over %s" %ctime()后,没有等待子线程,直接就退出了,同时子线程也一同结束。需要加一句t.join(),才会等待子线程。t.setDaemon(True)t.start()# join()的作用是,在子线程完成运行之前,这个子线程的父线程将一直被阻塞。t.join()print "all over %s" %ctime()
I was listening to 爱情买卖. Mon Feb 27 16:14:36 2017
I was at the 阿凡达! Mon Feb 27 16:14:36 2017
I was listening to 爱情买卖. Mon Feb 27 16:14:37 2017
I was at the 阿凡达! Mon Feb 27 16:14:41 2017
all over Mon Feb 27 16:14:46 2017

从执行结果可看到,music 和move 是同时启动的。

开始时间36秒,直到调用主进程为46,总耗时为10秒。从单线程时减少了2秒。

这里再聊聊,进程与线程的区别。

对于操作系统来说,一个任务就是一个进程。例如打开浏览器,打开word,打开记事本等等,都是独立的任务,它们各自为一个或者多个进程。这里要注意的是,同一种任务打开多个,分别属于不同进程,例如chrome打开多个标签,实际上它创建了多个进程。

对于一个任务来说,它有很多子任务,例如播放器,既要解码视频、也要解码音频,所以在进程下存在多线程。在一个进程下一定存在一个线程,可以称它为主线程。

操作系统创建进程时,会单独为每一个进程分配各自的资源,进程与进程之间相互隔离。而进程内的线程,则共享了当前进程内的资源。可见,操作系统执行的粒度是线程,分配资源的粒度是进程,我们的多任务操作系统,在单核CPU上是在各个线程上不断切换而达到目的,而在多核CPU上则能同时执行多个线程任务。

概念上来说,多进程并发即运行多个独立的程序,优势在于并发处理的任务都由操作系统管理,不足之处在于程序与各进程之间的通信和数据共享不方便。
多线程并发则由程序员管理并发处理的任务,这种并发方式可以方便地在线程间共享数据(前提是不能互斥)。

在linux中,每个进程都是由父进程提供的。每启动一个子进程就从父进程克隆一份数据,但是进程之间的数据本身是不能共享的。
在一般情况下多个进程的内存资源是相互独立的,而多线程可以共享同一个进程中的内存资源。多进程之间的通信通过Queue()或Pipe()来实现。

GIL锁( Global Interpreter Lock )
Python的线程虽然是真正的线程,但解释器执行代码时,有一个GIL锁:Global Interpreter Lock,任何Python线程执行前,必须先获得GIL锁,然后,每执行100条字节码,解释器就自动释放GIL锁,让别的线程有机会执行。这个GIL全局锁实际上把所有线程的执行代码都给上了锁,所以,多线程在Python中只能交替执行,即使100个线程跑在100核CPU上,也只能用到1个核。

GIL是Python解释器设计的历史遗留问题,通常我们用的解释器是官方实现的CPython,要真正利用多核,除非重写一个不带GIL的解释器。

所以,在Python中,可以使用多线程,但不要指望能有效利用多核。如果一定要通过多线程利用多核,那只能通过C扩展来实现,不过这样就失去了Python简单易用的特点。

不过,也不用过于担心,Python虽然不能利用多线程实现多核任务,但可以通过多进程实现多核任务。多个Python进程有各自独立的GIL锁,互不影响。

参考:
http://www.cnblogs.com/fnng/p/3670789.html
http://www.wyblog.cn/2016/12/05/python%E5%A4%9A%E7%BA%BF%E7%A8%8B%E4%B8%8E%E5%A4%9A%E8%BF%9B%E7%A8%8B/
http://www.tuicool.com/articles/YJvMjmb

python 单线程和多线程相关推荐

  1. Python——单线程与多线程

    并发:一个人吃,一口菜一口包子,但由于切换速度快,感觉像在同时吃菜和包子 并行:两个人同时吃,一个人吃包子,一个吃菜,所有吃包子和吃菜是同时的.同步:并发或并行的各个任务不是独自运行的任务之间有一定的 ...

  2. python 单线程与多线程爬虫

    帮别人写爬虫,先是单线程,太慢,改了多线程 1.单线程 import urllib import urllib.request import requests import xlwt import r ...

  3. Python单线程、多线程、多进程运行效率评测对比

    近日用python做图像处理,涉及到推拉流使用了python的多进程机制,结果导致程序运行效率大大下降,后来在反复试验中又发现子进程的速度比主进程快很多,特地做此测评.先上结论 评测结果 程序运行速度 ...

  4. python单线程和多线程的区别

    多线程与单线程的区别 1.生活举例 你早上上班,正要打卡的时候,手机响了..你如果先接了电话,等接完了,在打卡,就是单线程. 如果你一手接电话,一手打卡.就是多线程,2件事的结果是一样的..你接了电话 ...

  5. 关于python的单线程和多线程

    单线程 比如两件事,要相继执行,而不是一起执行 '''学习一下单线程和多线程的问题'''from time import ctime,sleep '''单线程''' print('单线程开始:') d ...

  6. Python单线程/多线程

    Python里的多线程是假的多线程,不管有多少核,同一时间只能在一个核中进行操作! 利用Python的多线程,只是利用CPU上下文切换的优势,看上去像是并发,其实只是单线程. import threa ...

  7. Python的单线程和多线程

    1.发展背景 2.进程和线程的区别 线程是程序执行的最小单位,而进程是操作系统分配资源的最小单位: 一个进程由一个线程组成,线程是一个进程中代码的不同执行路线: 进程之间相互独立,但同一进程下的各个线 ...

  8. python是多线程还是单线程_Python单线程与多线程

    最近一直在学习爬虫的相关知识,目前学习到了单线程.多线程这一块,把自己的学习经历分享出来顺便也做个笔记. 一.单线程操作 单线程操作就是我们日常写代码时的操作,为了比较出和多线程的区别,以下为其对比. ...

  9. Python 爬虫:单线程、多线程和协程的爬虫性能对比

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理. PS:如有需要Python学习资料的小伙伴可以点击下方链接自行获取 Python免费学习资料 ...

最新文章

  1. 面试官:磁盘 IO 变高,你怎么分析?
  2. 自然语言处理的现实应用
  3. Codeforces 429 A. Xor-tree
  4. Angel Borja博士教你如何撰写科学论文三:Writing the first draft of your science paper — some dos and don’ts
  5. lcx转发3389数据
  6. 【转】使用ant来调用Jmeter,并定制运行时参数
  7. 学信网:研究生云复试平台快速搭建上线
  8. 【嵌入式Linux】嵌入式Linux应用开发基础知识之多线程编程
  9. gatewayfilter详解_Spring Cloud Gateway 之 Filter
  10. leetcode经典题 刷题题解 python版
  11. Linux 最常用命令(简单易学,能解决 95% 以上的问题)
  12. SiamFC复现结果
  13. 有没有什么免费的网页视频录制软件?PC端视频录制软件集合
  14. Python | NumPy | 不完全总结
  15. 解决hive表中comment中文乱码问题
  16. 基于Python的发票识别与机器学习(保姆式教程)
  17. js MessageBox 类 无插件,支持弹出层(原页面div 或者 div代码),消息框(alert confirm)
  18. 如何写好一篇技术文章?
  19. C++实验一简单的C程序设计(一)
  20. 解决 Jupyter notebook 运行SHELL 命令(!xxx), 出错: OSError: “/bin/bach“ shell not found

热门文章

  1. 【整理】IT人怎么学人际沟通
  2. 一文带你了解Nginx基础知识 | 建议收藏
  3. iSpace PIM 3.6.0.2027 个人任务管理系统发布
  4. 广州哪有软件测试培训班,广州软件测试培训
  5. Gazebo导入SolidWorks模型
  6. Qt连接sqlite数据库
  7. MYO:体感新玩法,生物电感应
  8. Web tech resource
  9. ER图连接线上加个圆圈什么意思_如何拿链家网的租房数据做些有意思的事情?...
  10. Windows server DNS服务器搭建