• 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函数来解决

  • 相关阅读:
    第十六章 Centos7下Docker安装GitLab
    第二十六章 Kubeadm方式搭建kubernetes高可用集群
    第二十五章 Kubernetes部署Promethus集群资源监控
    小程序遮罩层效果实现
    docker停止所有,删除容器命令
    sp欢迎页支持
    c#学习
    静态资源访问前缀
    webjar使用
    springboot静态资源配置原理
  • 原文地址:https://www.cnblogs.com/bupt/p/sh01.html
Copyright © 2020-2023  润新知