线程和进程的区别及Python代码实例


Posted in Python onFebruary 04, 2015

在程序猿的世界中,线程和进程是一个很重要的概念,很多人经常弄不清线程和进程到底是什么,有什么区别,本文试图来解释一下线程和进程。首先来看一下概念:

进程(英语:process),是计算机中已运行程序的实体。进程为曾经是分时系统的基本运作单位。在面向进程设计的系统(如早期的UNIX,Linux 2.4及更早的版本)中,进程是程序的基本执行实体;在面向线程设计的系统(如当代多数操作系统、Linux 2.6及更新的版本)中,进程本身不是基本运行单位,而是线程的容器。程序本身只是指令、数据及其组织形式的描述,进程才是程序(那些指令和数据)的真正运行实例。?维基百科

线程(英语:thread)是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。?维基百科

概念太吓人了,先来看一下进程,这个相对于线程来说还是稍微好理解一点的。进程,是程序运行的实体,这句话的意思是,程序是存放在硬盘中的,当这个程序运行时,就会产生若干个进程,并且这个进程是可见的,在windows8的任务管理器中,我们看到有下列进程:

线程和进程的区别及Python代码实例

那么什么是线程呢?如果你编写过程序,特别是类似windows的批处理这样的逻辑控制语句少的语言,就能明显感觉到,当运行一个程序是,实际上整个运行的过程是从头部一直运行到尾部。例如有这样一段批处理的代码,提示用户输入姓名,然后根据姓名输出问候:

@echo off
set /p name=请输入您的姓名: 
cls
echo 你好,%name
pause

这段小程序就是自上而下执行,执行完毕则退出。不管是批处理,像PHP,Node.JS等都是这样自上而下执行的。实际上这就是一个线程,可以这样去理解:线程是一个任务流,它被包含在进程之中。有个例子:

5月1号这一天,麦当劳生意比较火爆,人很多,前台有6个窗口,有4个窗口在工作,随着要吃饭的人变多,麦当劳不得不开放了剩余的两个窗口。在这里,每一个窗口就是一个进程,处理卖垃圾食品这样一个任务,让系统需要处理更多请求时候,开放窗口就是增加进程来处理需求。由于是假期,发现即使是6个窗口全开了,排队的客户还是很多,那么,这里是不是没有其它的办法了呢?效率都是逼出来的,经理发现,客户买完东西,在旁边等,当客户的汉堡(或者其它垃圾食品)准备好了,是由单独的一个人(小明)把食品递给客户,由于这个人需要把准备好的食物分别送给6个不同窗口的客户,所以效率很低。这时候经理发话了,食品准备好了,直接由窗口的售卖人员把食品给正在等在的客户,这样比较节省时间。在这里,前台售卖人员的工作就有原来的一项专门售卖商品的工作,变成了两项,就是两个进程。

进上总结,一个进程中至少有一个线程,在实际的工作中,不是所有的程序都支持多线程,也有一些程序对多进程也支持得不够好,像PHP,Node.js等都是单进程,单线程的。

下面这个python的脚本让一个进程中运行两个线程:

import time 
import thread 
def Ordering(interval): 
  cnt = 0 
  while cnt<100: 
    print '好了,你订餐成功,订餐号码是:%d号 订餐时间是:%s 请在旁边耐心等待\n\n'%(cnt, time.ctime()) 
    time.sleep(interval) 
    cnt+=1 
  thread.exit_thread() 
def Notice(interval): 
  cnt = 0 
  while cnt<100: 
    print '谁的号码是%d,您的餐好了,过来取一下\n'%(cnt) 
    time.sleep(interval) 
    cnt+=1 
  thread.exit_thread()  
  
def work(): #Use thread.start_new_thread() to create 2 new threads 
  thread.start_new_thread(Ordering,(1,)) 
  thread.start_new_thread(Notice,(5,)) 
  
if __name__=='__main__': 
  work()
Python 相关文章推荐
python下如何让web元素的生成更简单的分析
Jul 17 Python
python基础教程之udp端口扫描
Feb 10 Python
Python分析学校四六级过关情况
Nov 22 Python
Python结合ImageMagick实现多张图片合并为一个pdf文件的方法
Apr 24 Python
python读取excel指定列数据并写入到新的excel方法
Jul 10 Python
python实现生成字符串大小写字母和数字的各种组合
Jan 01 Python
Python设计模式之迭代器模式原理与用法实例分析
Jan 10 Python
Python设计模式之享元模式原理与用法实例分析
Jan 11 Python
matplotlib实现区域颜色填充
Mar 18 Python
Python项目 基于Scapy实现SYN泛洪攻击的方法
Jul 23 Python
利用Python函数实现一个万历表完整示例
Jan 23 Python
Python+OpenCV实现图片中的圆形检测
Apr 07 Python
Python中使用PIPE操作Linux管道
Feb 04 #Python
Python实现在Linux系统下更改当前进程运行用户
Feb 04 #Python
使用Python编写Linux系统守护进程实例
Feb 03 #Python
Python中使用select模块实现非阻塞的IO
Feb 03 #Python
Python异常学习笔记
Feb 03 #Python
Python中的迭代器漫谈
Feb 03 #Python
Python描述器descriptor详解
Feb 03 #Python
You might like
php图片处理:加水印、缩略图的实现(自定义函数:watermark、thumbnail)
2010/12/02 PHP
php适配器模式介绍
2012/08/14 PHP
优化PHP代码技巧的小结
2013/06/02 PHP
深入分析使用mysql_fetch_object()以对象的形式返回查询结果
2013/06/05 PHP
PHP将HTML转换成文本的实现代码
2015/01/21 PHP
PHP连接数据库实现注册页面的增删改查操作
2016/03/27 PHP
PHP实现超简单的SSL加密解密、验证及签名的方法示例
2017/08/28 PHP
javascript 打开页面window.location和window.open的区别
2010/03/17 Javascript
基于jsTree的无限级树JSON数据的转换代码
2010/07/27 Javascript
jquery幻灯片插件bxslider样式改进实例
2014/10/15 Javascript
jquery实现仿Flash的横向滑动菜单效果代码
2015/09/17 Javascript
JavaScript编写九九乘法表(两种任选)
2017/02/04 Javascript
详解win7 cmd执行vue不是内部命令的解决方法
2017/07/27 Javascript
Vuejs 页面的区域化与组件封装的实现
2017/09/11 Javascript
Angular 4根据组件名称动态创建出组件的方法教程
2017/11/01 Javascript
移动前端图片压缩上传的实例
2017/12/06 Javascript
vue.js过滤器+ajax实现事件监听及后台php数据交互实例
2018/05/22 Javascript
webpack打包非模块化js的方法
2018/10/24 Javascript
js实现鼠标拖拽缩放div实例代码
2019/03/25 Javascript
一篇文章介绍redux、react-redux、redux-saga总结
2019/05/23 Javascript
koa2 用户注册、登录校验与加盐加密的实现方法
2019/07/22 Javascript
vue插件--仿微信小程序showModel实现模态提示窗功能
2020/08/19 Javascript
放弃 Python 转向 Go语言有人给出了 9 大理由
2017/10/20 Python
Python3实现发送QQ邮件功能(附件)
2020/12/23 Python
python队列通信:rabbitMQ的使用(实例讲解)
2017/12/22 Python
Python图片转换成矩阵,矩阵数据转换成图片的实例
2018/07/02 Python
Python实现爬取亚马逊数据并打印出Excel文件操作示例
2019/05/16 Python
python opencv 批量改变图片的尺寸大小的方法
2019/06/28 Python
Python帮你识破双11的套路
2019/11/11 Python
Python concurrent.futures模块使用实例
2019/12/24 Python
Pytorch Tensor基本数学运算详解
2019/12/30 Python
Tensorflow实现部分参数梯度更新操作
2020/01/23 Python
瑞典时尚服装购物网站:Miinto.se
2017/10/30 全球购物
MyBag中文网:英国著名的时尚包袋电商零售网站
2020/07/31 全球购物
2014年人事工作总结范文
2014/11/19 职场文书
高中班主任培训心得体会
2016/01/07 职场文书