zoukankan      html  css  js  c++  java
  • day04 python——进程和线程

    一、进程和线程

    进程

      我们都知道计算机的核心是CPU,它承担了所有的计算任务,而操作系统是计算机的管理者,它负责任务的调度,资源的分配和管理,

    统领整个计算机硬件;应用程序是具有某种功能的程序,程序是运行于操作系统之上的。

      进程是一个具有一定独立功能的程序在一个数据集上的一次动态执行的过程,是操作系统进行资源分配和调度的一个独立单位,是应用

    程序运行的载体。进程是一种抽象的概念,从来没有统一的标准定义。进程一般由程序,数据集合和进程控制块三部分组成。程序用于描述

    进程要完成的功能,是控制进程执行的指令集;数据集合是程序在执行时所需要的数据和工作区;程序控制块包含进程的描述信息和控制信息

    是进程存在的唯一标志

    进程具有的特征:

        动态性:进程是程序的一次执行过程,是临时的,有生命期的,是动态产生,动态消亡的;

        并发性:任何进程都可以同其他进行一起并发执行;

        独立性:进程是系统进行资源分配和调度的一个独立单位;

        结构性:进程由程序,数据和进程控制块三部分组成

    线程

      在早期的操作系统中并没有线程的概念,进程是拥有资源和独立运行的最小单位,也是程序执行的最小单位。任务调度采用的是时间片

    轮转的抢占式调度方式,而进程是任务调度的最小单位,每个进程有各自独立的一块内存,使得各个进程之间内存地址相互隔离。

      后来,随着计算机的发展,对CPU的要求越来越高,进程之间的切换开销较大,已经无法满足越来越复杂的程序的要求了。于是就发明

    了线程,线程是程序执行中一个单一的顺序控制流程,是程序执行流的最小单元,是处理器调度和分派的基本单位。一个进程可以有一个或

    多个线程,各个线程之间共享程序的内存空间(也就是所在进程的内存空间)。一个标准的线程由线程ID,当前指令指针PC,寄存器和堆栈组

    成。而进程由内存空间(代码,数据,进程空间,打开的文件)和一个或多个线程组成。

    并发和并行

    进程和线程的区别

      1. 线程是程序执行的最小单位,而进程是操作系统分配资源的最小单位;

      2. 一个进程由一个或多个线程组成,线程是一个进程中代码的不同执行路线

      3. 进程之间相互独立,但同一进程下的各个线程之间共享程序的内存空间(包括代码段,数据集,堆等)及一些进程级的资源(如打开文件和信

    号等),某进程内的线程在其他进程不可见;

      4. 调度和切换:线程上下文切换比进程上下文切换要快得多

    多进程

     1 from random import randint
     2 from time import time, sleep
     3 
     4 
     5 def download_task(filename):
     6     print('开始下载%s...' % filename)
     7     time_to_download = randint(5, 10)
     8     sleep(time_to_download)
     9     print('%s下载完成! 耗费了%d秒' % (filename, time_to_download))
    10 
    11 
    12 def main():
    13     start = time()
    14     download_task('Python从入门到住院.pdf')
    15     download_task('Peking Hot.avi')
    16     end = time()
    17     print('总共耗费了%.2f秒.' % (end - start))
    18 
    19 
    20 if __name__ == '__main__':
    21     main()

    总结:在上面的代码中,我们通过Process类创建了进程对象,通过target参数我们传入一个函数来表示进程启动后要执行的代码,后面的args是一个元组,它代表了传递给函数的参数。Process对象的start方法用来启动进程,而join方法表示等待进程执行结束。运行上面的代码可以明显发现两个下载任务“同时”启动了,而且程序的执行时间将大大缩短,不再是两个任务的时间总和。下面是程序的一次执行结果。

    不定参数长

    创建一个page文件夹

    1 def count(func):
    2     def warp(*args,**kwargs):
    3         num = kwargs['num']
    4         if num > 4:
    5             print('404')
    6         else:
    7             return func(*args,**kwargs)
    8     return warp

    运行下面这个文件夹

    1 from page import count
    2 
    3 @count
    4 def page_1(num):
    5     print('页面详情')
    6 
    7 if __name__ == '__main__':
    8     for i in range(10):
    9         page_1(num = i)
  • 相关阅读:
    年终盘点 | 七年零故障支撑 双11 的消息中间件 RocketMQ,怎么做到的?
    刚刚,阿里云知行动手实验室正式开放公测了
    dubbogo 3.0:牵手 gRPC 走向云原生时代
    一个改变世界的“箱子”
    我看技术人的成长路径
    云原生体系下的技海浮沉与理论探索
    分布式事务框架 seata-golang 通信模型详解
    Serverless 如何落地?揭秘阿里核心业务大规模落地实现
    Github 2020 年度报告:你以为新冠击溃了开发者?不!他们创造了更多代码...
    493. Reverse Pairs
  • 原文地址:https://www.cnblogs.com/hisashi-mitsui/p/11329439.html
Copyright © 2011-2022 走看看