zoukankan      html  css  js  c++  java
  • python进阶------进程线程(一)

    Python中的进程线程

    一、进程线程的概念

    1.1进程:

    进程就是一个程序在一个数据集上的一次动态执行过程。进程一般由程序、数据集、进程控制块三部分组成。我们编写的程序用来描述进程要完成哪些功能以及如何完成;数据集则是程序在执行过程中所需要使用的资源;进程控制块用来记录进程的外部特征,描述进程的执行变化过程,系统可以利用它来控制和管理进程,它是系统感知进程存在的唯一标志。

    进程的概念比较抽象,可以这么说:一个软件的在没有运行的时候就是一堆文件的组成,但是只要一运行那么它就“活”到了内存中,这个“活”到内存中的过程就是这个程序的进程。

    1.2线程:

    线程也叫轻量级进程,它是一个基本的CPU执行单元,也是程序执行过程中的最小单元,由线程ID、程序计数器、寄存器集合和堆栈共同组成。线程的引入减小了程序并发执行时的开销,提高了操作系统的并发性能。线程没有自己的系统资源。其实程序的具体执行都是交由线程来执行的,每一个线程都可以调用在该进程中的共有资源

    线程的出现是为了降低上下文切换的消耗,提高系统的并发性,并突破一个进程只能干一样事的缺陷,使到进程内并发成为可能。

    进程是最小的资源管理单元,而线程是最小的执行单元。

    1.3进程与线程的关系:

    进程是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。或者说进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位。
    线程则是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。

    (1)一个线程只能属于一个进程,而一个进程可以有多个线程,但至少有一个线程(主线程)(一个主线程可以开辟多个线程)。
    (2)资源分配给进程,同一进程的所有线程共享该进程的所有资源。
    (3)CPU分给线程,即真正在CPU上运行的是线程(这也就是证明了代码的最小执行单元是线程)。

    进程线程的切换原则:

        1.时间片:操作系统会给你设置一个时间当你线程或线程运行的时间超过了这个时间就会进行切换。

        2.遇到IO操作:上层程序是无法直接调用硬件的, 那么在调用硬件的时候会发送IO请求,发送请求之后会进行等待,(在那儿卡住)在这个等待时间是不占用CPU资源的这时CPU会切换到需要用到计算的进程或线程了。

        3.优先级切换,操作系统对程序也设置了优先级,优先级高的先执行。(用的不多)

    1.4并行和并发:

    并行处理(Parallel Processing)是计算机系统中能同时执行两个或更多个处理的一种计算方法。并行处理可同时工作于同一程序的不同方面。并行处理的主要目的是节省大型和复杂问题的解决时间。并发处理(concurrency Processing):指一个时间段中有几个程序都处于已启动运行到运行完毕之间,且这几个程序都是在同一个处理机(CPU)上运行,但任一个时刻点上只有一个程序在处理机(CPU)上运行

    并发的关键是你有处理多个任务的能力,不一定要同时。并行的关键是你有同时处理多个任务的能力。所以说,并行是并发的子集。

    程序的运行一般都是并行与并发相结合的。

    同一时间内串行,并行,和并发的执行过程(如图)。

    串行:流程一个线程执行完再执行下一个线程。

    并行:同一时间内同时执行这三个线程。(以三个CPU的话,一个CPU执行一个线程)

    并发:执行一个线程只执行他的一点内容,然后再执行另一个线程的的一部分(切换),以此类推知道程序结束(操作系统在切换过程中会保存该线程的运行状态,切换回来的时候执行从上一次保存的状态开始执行),此过程的耗损时间人感觉不到,给人感觉程序就像是在同时运行。

    1.5 同步与异步

    在计算机领域,同步就是指一个进程在执行某个请求的时候,若该请求需要一段时间才能返回信息,那么这个进程将会一直等待下去,直到收到返回信息才继续执行下去;异步是指进程不需要一直等下去,而是继续执行下面的操作,不管其他进程的状态。当有消息返回时系统会通知进程进行处理,这样可以提高执行的效率。举个例子,打电话时就是同步通信,发短息时就是异步通信。

    二、threading模块

    Python中以threading模块来实现多线程与多进程(并发)

    import threading

    import time

    def foo(n):

      time.sleep(n)

      print("foo....%s"%n)

      pring(threading.activeCount())

    def bar(n):

      time.sleep(n)

      print("bar....%s"%n)

     s=time.time()

    t1=threading.Thread(target=foo,args=(2,))#生成一个线程实例。

    t1.setDaemon(True)#将线程申明为守护线程

    '''
             将线程声明为守护线程,必须在start() 方法调用之前设置,如果不设置为守护线程程序会被无限挂起。
    
             当我们在程序运行中,执行一个主线程,如果主线程又创建一个子线程,主线程和子线程 就分兵两路,分别运行,那么当主线程完成
    
             想退出时,会检验子线程是否完成。如果子线程未完成,则主线程会等待子线程完成后再退出。但是有时候我们需要的是只要主线程
    
             完成了,不管子线程是否完成,都要和主线程一起退出,这时就可以 用setDaemon方法啦'''
    
    

     

    t1.start()

    t2=threading.Thread(target=bar,args=(5,))

    t2.start()#启动线程

    t1.join()#阻塞主线程(在子线程完成运行之前吗,这个子线程的父线程一直在阻塞状态)

    t2.join()

    print("ending")

    print("cost time:",time.time()-s)

  • 相关阅读:
    自定义UIView
    iOS界面-仿网易新闻左侧抽屉式交互
    初级美语 L081:A Heavy Price to Pay 解析
    初级美语 L079:Showing Off 解析
    初级美语 L077:Rome Wasn't Built in a Day 解析
    初级美语 L075:Michael’s Dream 解析
    初级美语 L073:Joe's Restaurant 解析
    初级美语 L071:Working Hard 解析
    初级美语 L069:Running a Bookstore 解析
    初级美语 L067:Getting Married 解析
  • 原文地址:https://www.cnblogs.com/niubin/p/7196547.html
Copyright © 2011-2022 走看看