Python 之 线程与进程

 线程与进程的概念

  对于一般程序而言,可能会有若干个进程,同时,每个进程又可能有多个同时执行的线程。进程是资源管理的最小单元,线程是程序执行的最小单元

1 进程

  直观来讲,进程就是正在执行的程序,是多任务操作系统执行任务的基本单元,是包含了程序指令与相关资源的集合。操作系统分隔各个进程可以访问的地址区域。如果进程间需要传递信息,可以使用进程间通信(IPC)或其他方式,如文件 数据库等。在进程调度中,进程切换需要的时间比较多。为了能够更好的支持信息共享和减小切换开销,从进程中演化出了线程。

2 线程

  线程是进程的执行单元。对于大多数程序来说,可能只有一个主线成,但是为了能够提高效率,有些程序会采用多线程,在系统中,所有线程看起来都是同时执行的。

3 进程与线程的对比

  一般来说,进程是重量级的,具体包括进程映射的结构 执行细节以及进程切换的方法。在进程中,需要处理的问题包括进程间通信 临界区域管理和进程调度等。这些特性使得新生成一个进程的开销比较大。而线程是轻量级的。线程间共享许多资源,容易进行通信,生成一个线程的开销较小,但是使用线程会遇到死锁 数据同步和实现复杂等问题。。

  由于python语言是用了GIL和队列模型,所以在线程实现上的复杂读相对于其他语言来说低了很多。需要注意的是,由于GIL的存在,所以Python解释器不是线程安全的。因为当线程执行时需要持有这个GIL,从而可以安全的访问python对象。虽然GIL使得Python不能很好的利用多个CPU的优势,但是现在没有很好的替代办法。

  对于I/O受限的程序,可以使用多线程来提高程序性能,而对于CPU受限的程序,使用多线程并不会带来效率的提升。

4 Python中对线程和进程的支持

 os/sys :popen      生成新的进程

     system      直接生成字符串代表的进程

     abort/exit     终止进程

     exec家族     在现有线程进程环境下生成新的进程

subprocess:python基本库中与多进程相关的模块

signal:    python基本库中信号相关的模块

threading: python基本库中与线程相关的模块

5  Python下线程的编程

  1)运行环境:

    对于每个进程,系统都会提供一个相关的运行环境(也就是环境变量的集合)。当进程启动的时候,环境变量和其值就确定下来了,只有当前进程能够改变其环境变量,父进程和子进程都不行。而且在创建进程的时候,子进程会得到父进程环境变量的一个副本。所以对父进程环境变量的修改不会影响到子进程。

    python中,os模块的environ属性用来记录当前进程的运行环境,这是一个字典型的数据结构,其中,key是环境变量的变量名,value是环境变量的值。

  2)创建子进程(这里只介绍os模块中相关的函数,subprocess等回头又时间在介绍):

    os模块中主要包括的system和exec家族函数,能够适应不同的创建进程需求。

    system函数:

      函数原型:system(command)

      此函数在新的进程中执行command字符串命令。如果返回0,表示命令执行成功,否则执行失败。

>>> import os
>>> print os.system("dir")
......
0                《《《---表示执行成功
     exec家族函数

      一共包含8个类似的函数:execl execle execlp execlpe execv execve exevp execvpe

注意:虽然他们都可以创建进程,但是与system函数不同哦~system函数实际上是调用系统内置的命令行程序来执行系统命令,所以在命令结束之后会将控制权发挥给Python进程,但是所有的exec函数在执行命令之后,将会接管python进程,而不会将控制权返回

  3)终止进程

    sys.exit/os.abort

      sys.exit是以一种比较柔和的手段终止进程,在程序退出之前会执行一些清理操作,同时将返回值给调用进程。利用该返回值,系统可以判断程序是正常退出或者运行出现了异常。

复制代码
1 import sys
2 
3 try:
4 filename = sys.argv[1]
5 print filename
6 except:
7 print "Usage:", sys.argv[0], "filename"
8 sys.exit(1)
9 return 0
复制代码

      os.abort函数是一种“暴力“退出方式,将会直接给进程发送终止信号。默认情况下,在退出前,不会做相关的清理工作。

一般情况下,都是用exit来代替abort。但是当exit不能终止程序或者运行时间过长时,可以尝试使用abort函数来解决

原文地址:
http://www.cnblogs.com/bupt/archive/2013/03/31/sh01.html
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值