精华内容
下载资源
问答
  • python多进程多线程,多个程序同时运行

    千次阅读 多人点赞 2021-04-08 13:47:15
    python 多线程 多进程同时运行 多任务要求 python 基础语法 python 文件目录操作 python 模块应用 开发工具 pycharm 实现方法 多任务的实现可以用进程和线程来实现 进程—> 线程----> 多任务应用 多进程操作...

    python 多线程 多进程同时运行

    多任务要求

    1. python 基础语法
    2. python 文件目录操作
    3. python 模块应用

    开发工具

    pycharm

    实现方法

    多任务的实现可以用进程和线程来实现

    进程—> 线程----> 多任务应用

    多进程操作

    比如下载多个文件, 利用cpu 资源 提高效率

    多任务: 同一时间执行多个任务, 比如windows操作系统

    执行方式有两种( 表现形式 )

    并发

    在单核cpu中:

    在一段时间内交替执行多个任务, 例如单核cpu 处理多任务, 操作系统让各个任务交替进行

    并行

    多核cpu 给每个核都分配一个任务 每个核执行自己的任务

    真正意义上的同时执行

    如何实现( 原理 )

    多进程

    python 中实现多进程来实现多任务, 进程是操作系统进行资源分配和调度的最小单位, 一个运行起来的程序叫做进程, 没有在运行的程序叫做程序

    当一个.py 文件运行的时候系统会创建一个主进程

    比如

    def fun1():
        print(1)
    def fun2():
        print(2)
        
    fun1()
    fun2()
    

    代码运行的时候系统会先执行fun1 在执行fun2 按顺序运行

    使用多进程的话: 在程序运行的时候会创建一个主进程, 那么在程序运行除了主进程之外创建一个子进程, 我们让主进程去执行fun1(), 让子进程去执行fun2(), 让他们两个同时执行, 来实现多任务同时进行

    多进程完成多任务

    首先要知道如何去创建第二个进程, 第三个进程, 进程的创建有三个步骤

    1. 导入进程包
      • import multiprocessing
    2. 通过进程类去创建进程对象
      • 进程对象=multiprocessing.Process()
    3. 启动进程执行任务
      • 进程对象.start() 来开始执行进程
    import threading
    import time
    import os
    def fun1():
        for i in range(3):
            print('1')
            time.sleep(1)
    
    def fun2():
        for i in range(3):
            print('2')
            time.sleep(3)
    
    
    if __name__ == '__main__':
        sing_thread = threading.Thread(target=fun1)
        song_thread = threading.Thread(target=fun2)
    
        sing_thread.start()
        song_thread.start()
    

    通过进程类创建进程对象

    进程对象 = multiprocessing.Process(target= 任务名)

    参数名说明
    target执行的目标任务名, 这里指的是函数名(方法名)
    name进程名, 一般不用设置(系统自动为进程设置默认名字Process-1····)
    group进程组, 目前只能使用None

    必须要指定进程的名字target

    def none():
        pass
       
    process = multiprocessing.Process(target=none)
    process.start()
    

    进程如何执行带有参数的任务

    参数名说明
    args以元祖的方式给任务传递参数, 顺序要正确
    kwrags以字典的方式给执行任务传递参数, key 跟参数名要一致

    process = multiprocessing.Process(target=function, args=(10,)) arg传递的必须是参数所以传递一个变量的时候需要(10,)

    process = multiprocessing.Process(target=function, kwargs={'key': value})

    import multiprocessing
    import time
    import os
    
    def fun1(num):
        print('1进程PID', os.getpid())
        print('1进程父进程编号', os.getppid())
        for i in range(num):
            print('1....\n')
            time.sleep(0.5)
    
    
    def fun2(num):
        print('2进程PID', os.getpid())
        print('2进程父进程编号', os.getppid())
        for i in range(num):
            print('2...')
            time.sleep(0.5)
    
    # 1. 导入进程包
    
    if __name__ == '__main__':
        sing_process = multiprocessing.Process(target=fun1, args=(5,))
        dance_process = multiprocessing.Process(target=fun2, kwargs={'num':2}) # target
    
        #3. 启动进程
        sing_process.start()
        dance_process.start()
    

    获取进程编号

    1. 获取当前进程的编号
      • os.getpid()
    2. 获取当前父进程的编号
      • os.getppid()
    import os 
    os.getpid()
    def work():
        print('work 进程编号', os.getpid())
        print('work 父进程编号', os.getppid())
        
    

    主进程默认不会结束, 在子进程全部结束之后才会关闭主进程

    在实际中我们想要的效果, 主进程关闭,, 子进程全部关闭

    设置守护主进程

    希望主进程关闭的时候子进程不在执行. 则需要设置守护选项

    子进程对象.daemon=True 那么在主进程运行完成之后, 那么子进程也将会自动结束

    os 部分操作

    os 创建目标文件夹目录

    os.mkdir(dir)

    多线程

    实现多任务的另一种形式, 进程是分配资源的最小单位, 线程是程序执行的最小单位, 一个进程中最少有一个线程来负责该进程, 比如一个QQ(一个进程) 打开了两个窗口(两个线程)跟两个人聊天, 线程自己并不需要系统资源, 线程与其他线程共享这个进程的资源, 因此使用多线程的时候实现了资源节约,

    1. 多线程是Python 程序中实现多任务的一种方式
    2. 线程是程序执行的最小单位
    3. 同属于一个进程的多线程共享进程拥有的所有资源

    多线程实现多任务

    线程的创建步骤

    1. 导入线程模块
      • import threading
    2. 通过线程类去创建线程对象
      • 线程对象=threading.Thread(target=任务名)
    3. 启动线程执行任务
      • 线程对象.start()
    参数名说明
    target执行目标的任务名, 这里值函数名( 方法名)
    name线程名, 一般不用设置
    group线程组, 目前只能使用None

    其他的一毛一样

    进程线程对比

    关系对比

    1. 线程是依附在进程里边的, 没有进程就没有线程
    2. 一个进程默认提供一条线程, 进程可以创建多个线程

    区别对比

    1. 进程创建的开销要比线程的开销要大
    2. 进程是操作系统资源分配的基本单位, 线程是cpu 调度的基本单位
    3. 线程不能独立执行, 必须依存进程

    优缺点对比

    1. 进程优缺点:

      优点:可以用多核

      缺点:资源开销大

    2. 线程优缺点

      优点: 资源开销小

      缺点:不能使用多核

    本笔记总结于bilibili 黑马程序员
    多进程多线程视频

    展开全文
  • 关于Django多进程多线程详解

    万次阅读 2019-05-08 15:01:34
    文章目录Django 多线程#1 环境#2 Django原生单线程#3 Django server 默认多线程#3.1 测试#4 使用 uWSGI 服务器启动 django#4.1 启动 uWSGI#4.2 给uWSGI加进程数#5 总结关于django的多线程问题 Django 多线程 #1 环境...

    Django 多线程

    #1 环境

    Python3.7.3
    Django==2.0.7
    uWSGI==2.0.18
    

    #2 Django原生单线程

    • #1

    django 原生为单线程序,当第一个请求没有完成时,第二个请求辉阻塞,知道第一个请求完成,第二个请求才会执行。

    • #2

    Django就没有用异步,通过线程来实现并发,这也是WSGI普遍的做法,跟tornado不是一个概念


    #3 Django server 默认多线程

    官方文档解释django自带的server默认是多线程

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NMyHNqj4-1591867681155)(https://raw.githubusercontent.com/Coxhuang/yosoro/master/20190507225848-image.png)]

    #3.1 测试

    • python3 manage.py runserver 0.0.0.0:8000

    django开两个接口,第一个接口sleep(20),另一个接口不做延时处理(大概耗时几毫秒)

    先请求第一个接口,紧接着请求第二个接口,第二个接口返回数据,第一个接口20秒之后返回数据

    证明django的server是默认多线程

    • python3 manage.py runserver 0.0.0.0:8000 --nothreading

    重复上述步骤


    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uMJ9iYfh-1591867681157)(https://raw.githubusercontent.com/Coxhuang/yosoro/master/20190507230747-image.png)]


    #4 使用 uWSGI 服务器启动 django

    #4.1 启动 uWSGI

    # 在django项目目录下 Demo工程名
    uwsgi --http 0.0.0.0:8000 --file Demo/wsgi.py
    

    经过上述的步骤测试,发现在这种情况下启动django项目,uWSGI也是单线程,访问接口需要"排队"

    不给uWSGI加进程,uWSGI默认是单进程单线程

    #4.2 给uWSGI加进程数

    uwsgi --http 0.0.0.0:8000 --file Demo/wsgi.py --processes 4 --threads 2
    
    # processes: 进程数 # processes 和 workers 一样的效果
    # threads : 每个进程开的线程数 
    

    经过测试,接口可以"同时"访问,uWSGI提供多线程

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DpNUmPNA-1591867681159)(https://raw.githubusercontent.com/Coxhuang/yosoro/master/20190507233529-image.png)]


    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lBjZbSUv-1591867681160)(https://raw.githubusercontent.com/Coxhuang/yosoro/master/20190507233629-image.png)]


    #5 总结关于django的多线程问题

    • Python因为GIL的存在,在一个进程中,只允许一个线程工作,导致单进程多线程无法利用多核
    • 多进程的线程之间不存在抢GIL的情况,每个进程有一个自己的线程锁,多进程多GIL
    • 单进程多线程的python应用可以实现并发,但是不存在并行
    • 多进程的多处理器的python应用可能存在并行,至于并发还是并行,有操作系统决定,如果分配单处理器处理多进程,那就是并行,如果分配给多处理器那就是并行
    • Nginx+uWSGI可以实现python高并发


    展开全文
  • 线程、进程、多线程多进程 和 多任务 小结

    千次阅读 多人点赞 2019-04-20 11:59:56
    3 多进程 4 多线程 5 线程与进程的关系 6 线程和进程的区别 7 进程的优缺点 7.1 进程的优点 7.2 进程的缺点 8 线程的优缺点 8.1 线程的优点 8.2 线程的缺点 9 多线程的优缺点 9.1 多线程的优点 9.2 ...

    目录

    1 进程

    2 线程

    3 多进程

    4 多线程

    5 线程与进程的关系

    6 线程和进程的区别

    7 进程的优缺点

    7.1 进程的优点

    7.2 进程的缺点

    8 线程的优缺点

    8.1 线程的优点

    8.2 线程的缺点

    9 多线程的优缺点

    9.1 多线程的优点

    9.2 多线程的缺点

    10多进程的优缺点

    10.1 多进程的优点

    10.2 多进程的缺点

    8 多任务(多进程)

    参考资料


    最近经常看到 多进程,多线程和多任务等名词,很容易混。网上查了很多资料,内容很多。作为Linux初学者,还是想从最基础的开始了解,找通俗的例子了解,由浅入深。我把网上查阅的资料整理的一下,一次性全部摸透,还是有点难度的。写个博客,记录一下,以便后期查阅复习。

    首先,从定义开始,先看一下教科书上 进程线程定义:

    进程:资源分配的最小单位。

    线程:程序执行的最小单位。

    心中默念,啥啥啥,写的这是啥。于是乎 我就想到王宝强一脸懵逼的表情。

     

    1 进程

    进程是程序执行时的一个实例,即它是程序已经执行到课中程度的数据结构的汇集。从内核的观点看,进程的目的就是担当分配系统资源(CPU时间、内存等)的基本单位。

    举例说明进程

    想象一位有一手好厨艺的计算机科学家正在为他的女儿烘制生日蛋糕。他有做生日蛋糕的食谱,厨房里有所需的原料:面粉、鸡蛋、糖、香草汁等。在这个比喻中,做蛋糕的食谱就是程序(即用适当形式描述的算法)计算机科学家就是处理器(CPU),而做蛋糕的各种原料就是输入数据。进程就是厨师阅读食谱、取来各种原料以及烘制蛋糕等一系列动作的总和。现在假设计算机科学家的儿子哭着跑了进来,说他的头被一只蜜蜂蛰了。计算机科学家就记录下他照着食谱做到哪儿了(保存进程的当前状态),然后拿出一本急救手册,按照其中的指示处理蛰伤。这里,我们看到处理机制是从一个进程(做蛋糕)切换到另一个高优先级的进程(实施医疗救治),每个进程拥有各自的程序(食谱和急救手册)。当蜜蜂蛰伤处理完之后,这位计算机科学家又回来做蛋糕,从他离开时的那一步继续做下去。

     

    2 线程

    线程是CPU调度的最小单位(程序执行流的最小单元),它被包含在进程之中,是进程中的实际运作单元。一条线程是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。

    一个标准的线程有线程ID、当前指令指针(PC),寄存器集合和堆栈组成。另外,线程是进程中的一个实体,是被系统独立调度和分派的基本单元,线程自己不拥有系统资源,只拥有一点儿在运行中必不可少的资源,但它可与同属一个进程的其他线程共享进程所拥有的全部资源。一个线程可以创建和撤销另一个线程,同一进程中的多个线程之间可以并发执行。由于线程之间的相互制约,致使线程在运行中呈现处间断性。

    线程也有就绪、阻塞和运行三种基本状态。就绪状态是指线程具备运行的所有条件,逻辑上可以运行,在等待处理机;运行状态是指线程占有处理机正在运行;阻塞状态是指线程在等待一个事件(如某个信号量),逻辑上不可执行。每一个程序都至少有一个线程,若程序只有一个线程,那就是程序本身。

     

    举例说明线程

    假设,一个文本程序,需要接受键盘输入,将内容显示在屏幕上,还需要保存信息到硬盘中。若只有一个进程,势必造成同一时间只能干一样事的尴尬(当保存时,就不能通过键盘输入内容)。若有多个进程,每个进程负责一个任务,进程A负责接收键盘输入的任务,进程B负责将内容显示在屏幕上的任务,进程C负责保存内容到硬盘中的任务。这里进程A,B,C间的协作涉及到了进程通信问题,而且有共同都需要拥有的东西——-文本内容,不停的切换造成性能上的损失。若有一种机制,可以使任务A,B,C共享资源,这样上下文切换所需要保存和恢复的内容就少了,同时又可以减少通信所带来的性能损耗,那就好了。这种机制就是线程

    总的来说进程有独立的地址空间,线程没有单独的地址空间(同一进程内的线程共享进程的地址空间)。

     

     

    3 多进程

    进程是程序在计算机上的一次执行活动。当你运行一个程序,你就启动了一个进程。显然,程序是死的(静态的),进程是活的(动态的)。进程可以分为系统进程用户进程。凡是用于完成操作系统的各种功能的进程就是系统进程,它们就是处于运行状态下的操作系统本身;所有由用户启动的进程都是用户进程。进程是操作系统进行资源分配的单位。 进程又被细化为线程,也就是一个进程下有多个能独立运行的更小的单位。在同一个时间里,同一个计算机系统中如果允许两个或两个以上的进程处于运行状态,这便是多任务。现代的操作系统几乎都是多任务操作系统,能够同时管理多个进程的运行。 多任务带来的好处是明显的,比如你可以边听网易云音乐,一边上网,与此同时甚至可以将下载的文档打印出来,而这些任务之间丝毫不会相互干扰。那么这里就涉及到并行的问题,俗话说,一心不能二用,这对计算机也一样,原则上一个CPU只能分配给一个进程,以便运行这个进程。我们通常使用的计算机中只有一个CPU,也就是说只有一颗心,要让它一心多用,同时运行多个进程,就必须使用并发技术。实现并发技术相当复杂,最容易理解的是“时间片轮转进程调度算法”,它的思想简单介绍如下:在操作系统的管理下,所有正在运行的进程轮流使用CPU,每个进程允许占用CPU的时间非常短(比如10毫秒),这样用户根本感觉不出来 CPU是在轮流为多个进程服务,就好像所有的进程都在不间断地运行一样。但实际上在任何一个时间内有且仅有一个进程占有CPU。 如果一台计算机有多个CPU,情况就不同了,如果进程数小于CPU数,则不同的进程可以分配给不同的CPU来运行,这样,多个进程就是真正同时运行的,这便是并行

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

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

     

     

    4 多线程

    线程是程序中一个单一的顺序控制流程。进程内一个相对独立的、可调度的执行单元,是系统独立调度和分派CPU的基本单元。在单一程序中同时运行多个想成完成不同的工作,称为多线程

    多线程是为了使得多个线程并行的工作以完成多项任务,以提高系统的效率。线程是在同一时间需要完成多项任务的时候被实现的。

    打个比方:

    多进程是立体交通系统(近似于立交桥),虽然造价高,上坡下坡多耗点油,但是不堵车。

    多线程是平面交通系统,造价低,但红绿灯太多,老堵车。

     

     

    5 线程与进程的关系

    (1)一个线程只能属于一个进程,而一个进程可以有多个线程,但至少有一个线程;

    (2)资源分配给进程,同一进程内的所有线程共享该进程的所有资源;

    (3)线程在执行过程中需要协作同步。不同进程中的线程之间要利用消息通信的方法实现同步;

    (4)处理机分配给线程,即真正在处理机上运行的是线程;

    (5)线程是进程的一个执行单元,也是进程内的可调用实体。

     

     

    6 线程和进程的区别

    (1)线程共享内存空间;进程的内存是独立的;

    (2)同一个进程的线程之间可以直接交流;两个进程想通信,必须通过一个中间代理来实现;

    (3)创建新进程很简单;创建新进程需要对其父进程进行一个克隆;

    (4)一个线程可以控制和操作同一进程里的其他线程;但是进程只能操作子进程;

    (5)改变注线程(如优先权),可能会影响其他线程;改变父进程,不影响子进程。

    (6)调度:线程作为分配和调度的基本单位,进程作为拥有资源的基本单位

    (7)并发性:不进进程之间可以并发执行,同一进程内的线程也可以并发执行

    (8)拥有资源:进程是拥有资源的一个独立单位,线程不拥有系统资源,但是可以访问隶属于进程的系统资源

    (9)系统开销:在创建和撤销进程的时候,系统都要分配和回收资源,导致系统的明显大于创建和撤销线程时的开销。但进程有独立的地址空间,进程崩溃后,在保护模式的下不会对其他进程造成影响,而线程只是进程中的不同执行路径。线程有自己的堆栈和局部变量,但线程之间没有独立的地址空间,一个线程死后就等于整个进程死掉,所以多进程程序要比多线程程序健壮,但是在进程切换的时候消耗的资源较大,效率差。

    根本区别就一点:用多进程每个进程有自己的地址空间(address space),线程则共享地址空间。

    总结:多线程执行效率高;  多进程耗资源,安全。

     

     

    7 进程的优缺点

    7.1 进程的优点

    1)顺序程序的特点:具有封闭性和可再现性;

    2)程序的并发执行和资源共享。多道程序设计出现后,实现了程序的并发执行和资源共享,提高了系统的效率和系统的资源利用率。

     

    7.2 进程的缺点

    操作系统调度切换多个线程要比切换调度进程在速度上快的多。而且进程间内存无法共享,通讯也比较麻烦。线程之间由于共享进程内存空间,所以交换数据非常方便;在创建或撤消进程时,由于系统都要为之分配和回收资源,导致系统的开销明显大于创建或撤消线程时的开销。  

     

     

    8 线程的优缺点

    8.1 线程的优点

    1)它是一种非常"节俭"的多任务操作方式。在Linux系统下,启动一个新的进程必须分配给它独立的地址空间,建立众多的数据表来维护它的代码 段、堆栈段和数据段,这是一种"昂贵"的多任务工作方式。而运行于一个进程中的多个线程,它们彼此之间使用相同的地址空间,共享大部分数据,启动一个线程 所花费的空间远远小于启动一个进程所花费的空间,而且,线程间彼此切换所需的时间也远远小于进程间切换所需要的时间。当然,在具体的系统上,这个数据可能 会有较大的区别;

    2)线程间方便的通信机制,由于同一进程下的线程之间共享数据空间,所以一个线程的数据可以直接为其它线程所用,这不仅快捷,而且方便;

    3)使多CPU系统更加有效。操作系统会保证当线程数不大于CPU数目时,不同的线程运行于不同的CPU上;

    4)改善程序结构。一个既长又复杂的进程可以考虑分为多个线程,成为几个独立或半独立的运行部分,这样的程序会利于理解和修改。

     

    8.2 线程的缺点

    1)调度时, 要保存线程状态,频繁调度,需要占用大量的机时;

    2)程序设计上容易出错(线程同步问题)。

     

     

    9 多线程的优缺点

    9.1 多线程的优点

    1)无需跨进程边界; 程序逻辑和控制方式简单;

    2)所有线程可以直接共享内存和变量等;

    3)线程方式消耗的总资源比进程方式好。

     

    9.2 多线程的缺点

    1)每个线程与主程序共用地址空间,受限于2GB地址空间;

    2)线程之间的同步和加锁控制比较麻烦; 一个线程的崩溃可能影响到整个程序的稳定性;

    3)到达一定的线程数程度后,即使再增加CPU也无法提高性能,例如Windows Server 2003,大约是1500个左右的线程数就快到极限了(线程堆栈设定为1M),如果设定线程堆栈为2M,还达不到1500个线程总数;

    4)线程能够提高的总性能有限,而且线程多了之后,线程本身的调度也是一个麻烦事儿,需要消耗较多的CPU 。

     

    10多进程的优缺点

    10.1 多进程的优点

    1)每个进程互相独立,不影响主程序的稳定性,子进程崩溃没关系;

    2)通过增加CPU,就可以容易扩充性能;

    3)可以尽量减少线程加锁/解锁的影响,极大提高性能,就算是线程运行的模块算法效率低也没关系;

    4)每个子进程都有2GB地址空间和相关资源,总体能够达到的性能上限非常大。

     

    10.2 多进程的缺点

    1)逻辑控制复杂,需要和主程序交互;

    2)需要跨进程边界,如果有大数据量传送,就不太好,适合小数据量传送、密集运算 多进程调度开销比较大。

     

    总结:最好是多进程和多线程结合,即根据实际的需要,每个CPU开启一个子进程,这个子进程开启多线程可以为若干同类型的数据进行处理。当然你也可以利用多线程+CPU+轮询方式来解决问题……方法和手段是多样的,关键是自己看起来实现方便有能够满足要求,代价也合适。

     

    按照多个不同的维度(类别),来看看多线程和多进程的对比(注:因为是感性的比较,因此都是相对的,不是说一个好得不得了,另外一个差的无法忍受)。

        对比类别

                                        多进程

                                     多线程

         总结

    数据共享、同步

    数据共享复杂,需要用IPC;数据是分开的,同步简单

    因为共享进程数据,数据共享简单,但也是因为这个原因导致同步复杂

     各有优势

        内存、CPU

    占用内存多,切换复杂,CPU利用率低

    占用内存少,切换简单,CPU利用率高

     线程占优

     创建销毁、切换

    创建销毁、切换复杂,速度慢

    创建销毁、切换简单,速度很快

     线程占优

        编程、调试

    编程简单,调试简单

    编程复杂,调试复杂

     进程占优

           可靠性

    进程间不会互相影响

    一个线程挂掉将导致整个进程挂掉

     进程占优

           分布式

    适应于多核、多机分布式;如果一台机器不够,扩展到多台机器比较简单

    适应于多核分布式

     进程占优

    其实没有绝对的好与坏,只有哪个更加合适的问题。我们来看实际应用中究竟如何判断更加合适。

    1)需要频繁创建销毁的优先用线程

    这种原则最常见的应用就是Web服务器了,来一个连接建立一个线程,断了就销毁线程,要是用进程,创建和销毁的代价是很难承受的

     

    2)需要进行大量计算的优先使用线程

    所谓大量计算,当然就是要耗费很多CPU,切换频繁了,这种情况下线程是最合适的。这种原则最常见的是图像处理、算法处理。

     

    3)强相关的处理用线程,弱相关的处理用进程

    什么叫强相关、弱相关?理论上很难定义,给个简单的例子就明白了。

    一般的Server需要完成如下任务:消息收发、消息处理。“消息收发”和“消息处理”就是弱相关的任务,而“消息处理”里面可能又分为“消息解码”、“业务处理”,这两个任务相对来说相关性就要强多了。因此“消息收发”和“消息处理”可以分进程设计,“消息解码”、“业务处理”可以分线程设计。当然这种划分方式不是一成不变的,也可以根据实际情况进行调整。

     

    4)可能要扩展到多机分布的用进程,多核分布的用线程

     

    5)都满足需求的情况下,用你最熟悉、最拿手的方式

    至于“数据共享、同步”、“编程、调试”、“可靠性”这几个维度的所谓的“复杂、简单”应该怎么取舍,我只能说:没有明确的选择方法。但我可以告诉你一个选择原则:如果多进程和多线程都能够满足要求,那么选择你最熟悉、最拿手的那个。需要提醒的是:虽然我给了这么多的选择原则,但实际应用中基本上都是“进程+线程”的结合方式,千万不要真的陷入一种非此即彼的误区。

     

    8 多任务(多进程)

    现代操作系统比如Mac OS X,UNIX,Linux,Windows等,都是支持“多任务”的操作系统。

    什么叫“多任务”呢?简单地说,就是操作系统可以同时运行多个任务。打个比方,你一边在用浏览器上网,一边在听MP3,一边在用Word写论文,这就是多任务,至少同时有3个任务正在运行。还有很多任务悄悄地在后台同时运行着,只是桌面上没有显示而已。

    现在,多核CPU已经非常普及了,但是,即使过去的单核CPU,也可以执行多任务。由于CPU执行代码都是顺序执行的,那么,单核CPU是怎么执行多任务的呢

    其实操作系统轮流让各个任务交替执行,任务1执行0.01秒,切换到任务2,任务2执行0.01秒,再切换到任务3,执行0.01秒……这样反复执行下去。表面上看,每个任务都是交替执行的,但是,由于CPU的执行速度实在是太快了,我们感觉就像所有任务都在同时执行一样。

    真正的并行执行多任务只能在多核CPU上实现,但是,由于任务数量远远多于CPU的核心数量,所以,操作系统也会自动把很多任务轮流调度到每个核心上执行。

    对于操作系统来说,一个任务就是一个进程(Process),比如打开一个浏览器就是启动一个浏览器进程,打开一个记事本就启动了一个记事本进程,打开两个记事本就启动了两个记事本进程,打开一个Word就启动了一个Word进程。

    有些进程还不止同时干一件事,比如Word,它可以同时进行打字、拼写检查、打印等事情。在一个进程内部,要同时干多件事,就需要同时运行多个“子任务”,我们把进程内的这些 “子任务” 称为线程(Thread)。

    由于每个进程至少要干一件事,所以,一个进程至少有一个线程。当然,像Word这种复杂的进程可以有多个线程,多个线程可以同时执行,多线程的执行方式和多进程是一样的,也是由操作系统在多个线程之间快速切换,让每个线程都短暂地交替运行,看起来就像同时执行一样。当然,真正地同时执行多线程需要多核CPU才可能实现。

     

     

    参考资料

    [1] https://www.cnblogs.com/pingqiang/p/8007549.html#多进程多线程

    [2] https://www.cnblogs.com/ww36315610/p/3881533.html?tdsourcetag=s_pctim_aiomsg

    [3] http://www.cnblogs.com/Yogurshine/p/3640206.html

    [4] https://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a000/0013868322563729e03f6905ea94f0195528e3647887415000?tdsourcetag=s_pctim_aiomsg

    [5] https://www.cnblogs.com/yuanchenqi/articles/6755717.html#_label3?tdsourcetag=s_pctim_aiomsg

    [6] https://www.cnblogs.com/zhanht/p/5401685.html?tdsourcetag=s_pctim_aiomsg

    [7] https://www.kafan.cn/edu/85866456.html

     

    展开全文
  • 多进程多线程的区别和选择(总结) 关于多进程和多线程,教科书上最经典的一句话是“进程是资源分配的最小单位,线程是CPU调度的最小单位”,这句话应付考试基本上够了,但如果在工作中遇到类似的选择问题,那就没有...

    多进程多线程的区别和选择(总结)

    关于多进程和多线程,教科书上最经典的一句话是“进程是资源分配的最小单位,线程是CPU调度的最小单位”,这句话应付考试基本上够了,但如果在工作中遇到类似的选择问题,那就没有这么简单了,选的不好,会让你深受其害。

    经常在网络上看到有的XDJM问“多进程好还是多线程好?”、“Linux下用多进程还是多线程?”等等期望一劳永逸的问题,我只能说:没有最好,只有更好。根据实际情况来判断,哪个更加合适就是哪个好。

    我们按照多个不同的维度,来看看多线程和多进程的对比(注:因为是感性的比较,因此都是相对的,不是说一个好得不得了,另外一个差的无法忍受)。

    在这里插入图片描述

    1)需要频繁创建销毁的优先用线程

    原因请看上面的对比。

    这种原则最常见的应用就是Web服务器了,来一个连接建立一个线程,断了就销毁线程,要是用进程,创建和销毁的代价是很难承受的

    2)需要进行大量计算的优先使用线程

    所谓大量计算,当然就是要耗费很多CPU,切换频繁了,这种情况下线程是最合适的。

    这种原则最常见的是图像处理、算法处理。

    3)强相关的处理用线程,弱相关的处理用进程

    什么叫强相关、弱相关?理论上很难定义,给个简单的例子就明白了。

    一般的Server需要完成如下任务:消息收发、消息处理。“消息收发”和“消息处理”就是弱相关的任务,而“消息处理”里面可能又分为“消息解码”、“业务处理”,这两个任务相对来说相关性就要强多了。因此“消息收发”和“消息处理”可以分进程设计,“消息解码”、“业务处理”可以分线程设计。

    当然这种划分方式不是一成不变的,也可以根据实际情况进行调整。

    4)可能要扩展到多机分布的用进程,多核分布的用线程

    原因请看上面对比。

    5)都满足需求的情况下,用你最熟悉、最拿手的方式

    至于“数据共享、同步”、“编程、调试”、“可靠性”这几个维度的所谓的“复杂、简单”应该怎么取舍,我只能说:没有明确的选择方法。但我可以告诉你一个选择原则:如果多进程和多线程都能够满足要求,那么选择你最熟悉、最拿手的那个。

    需要提醒的是:虽然我给了这么多的选择原则,但实际应用中基本上都是“进程+线程”的结合方式,千万不要真的陷入一种非此即彼的误区。

    消耗资源:

    从内核的观点看,进程的目的就是担当分配系统资源(CPU时间、内存等)的基本单位。线程是进程的一个执行流,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。

    线程,它们彼此之间使用相同的地址空间,共享大部分数据,启动一个线程所花费的空间远远小于启动一个进程所花费的空间,而且,线程间彼此切换所需的时间也远远小于进程间切换所需要的时间。据统计,总的说来,一个进程的开销大约是一个线程开销的30倍左右,当然,在具体的系统上,这个数据可能会有较大的区别。

    通讯方式:


    本文来自 Fireplusplus 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/qq_33724710/article/details/52510600?utm_source=copy

    展开全文
  • 一、Python多进程多线程 关于python多进程多线程的相关基础知识,在我之前的博客有写过,并且就关于python多线程的GIL锁问题,也在我的一篇博客中有相关的解释。 为什么python多线程在面对IO密集型任务的时候会产生...
  • 多线程多进程

    千次阅读 2019-02-27 10:26:49
    多进程 多线程 优劣 数据共享、同步 数据是分开的:共享复杂,需要用IPC;同步简单 多线程共享进程数据:共享简单;同步复杂 各有优势 内存、CPU 占用内存多,切换复杂,CPU利用率低 占用内存少...
  • robotframework 多进程 多线程

    千次阅读 2018-07-07 16:05:39
    一直想找个多进程执行rf case 的第三方库,都没找到。 这两天又上网找了找,从网上的两个回答里找到了灵感。 我们可以间接的达到这个目的。 参考答案: 使用Process Library 多进程,后台执行 ...
  • 多进程多线程的主要区别是:线程是进程的子集(部分),一个进程可能由多个线程组成。多进程的数据是分开的、共享复杂,需要用IPC;但同步简单。多线程共享进程数据,共享简单;但同步复杂。  多进程,Windows...
  • 多线程环境下,使用了线程不安全函数,函数调用可能会产生错误的结果,而这个bug非常难以发现。在程序莫名奇妙出错,或者偶然性出错时,就要考虑是否调用了非线程安全函数了。 文章目录 线程安全 可重入 可重入与...
  • python 彻底解读多线程多进程

    万次阅读 多人点赞 2019-03-26 14:20:34
    title: 多线程多进程 copyright: true top: 0 date: 2019-03-03 16:16:41 tags: 多线程多进程 categories: Python高阶笔记 permalink: password: keywords: description: 对python的多线程多进程进一步刨析。 真是...
  • python中的多任务-多线程多进程

    千次阅读 多人点赞 2019-03-10 11:12:29
    多线程多进程都是实现多任务的一种方式,但是对于很多初学者来说想分清楚他们往往是一件非常头疼的事,首先我们需要了解多任务的概念。 所谓的多任务就是在同一时刻同时做很多事情,比如我们一边使用浏览器...
  • Python之多进程多线程详解

    万次阅读 多人点赞 2018-10-16 18:02:56
    1.进程的概念 一个CPU的时候运行,轮询调度实现并发执行 CPU运行机制: 计算机程序:存储在磁盘上的可执行二进制(或其他类型)文件。 只有把它们加载到内存中,并被操作系统调用它们才会拥有其自己的生命周期。...
  • Python多进程多线程测试

    万次阅读 2019-09-17 17:18:35
    今天在工作中遇到爬虫效率问题,在此处记录多进程多线程测试脚本 #!/usr/bin/env python # -*- coding: utf-8 -*- __author__ = 'Seven' from concurrent.futures import ThreadPoolExecutor, ...
  • Python多进程多线程(跑满CPU)

    万次阅读 多人点赞 2019-05-07 15:06:16
    Python多进程多线程(跑满CPU) 概念 任务可以理解为进程(process),如打开一个word就是启动一个word进程。在一个word进程之中不只是进行打字输入,还需要拼写检查、打印等子任务,我们可以把进程中的这些子...
  • C/S架构与多进程多线程

    千次阅读 2016-03-16 17:02:33
    C/S架构与多进程多线程   如题,C/S架构指的是服务器(Server)与客户机(Client)协作完成网络程序功能的一种模式。它是已经在计算机世界活跃数十年的一种古老的软件架构。如今已渗入到各领域IT系统中。其模型...
  • MFC多进程多线程编程之--多线程

    千次阅读 2013-09-20 11:41:41
    进程是应用程序的执行实例,每个进程是...系统创建好进程后,实际上就启动执行了该进程的主执行线程,主执行线程以函数地址形式,比如说main或WinMain函数,将程序的启动点提供给Windows系统。主执行线程终止了,进程
  •  一个进程包括由操作系统分配的内存空间,包含一个或线程。一个线程不能独立的存在,它必须是进程的一部分。一个进程一直运行,直到所有的非守护线程都结束运行后才能结束。 线程  又称其为轻量级进程...
  • C语言多任务,多进程多线程

    千次阅读 2018-04-03 15:44:08
    Linux就是一种支持多任务的操作系统,它支持多进程多线程等多任务处理和任务之间的多种通信机制。Linux下多任务机制的介绍多任务处理是指用户在同一时间内运行多个应用程序,每个应用程序被称做一个任务。Linux...
  • 文章目录1 cpu架构和工作原理2 多核cpu和多cpu架构3 进程和线程4 多核、多CPU与多线程多进程的对应关系5 总结 1 cpu架构和工作原理 计算机有5大基本组成部分,运算器,控制器,存储器,输入和输出。运算器和控制器...
  • 多任务中 多线程多进程的区别

    万次阅读 多人点赞 2019-04-26 14:22:22
    多任务中 多线程多线程的区别
  • 10.多线程多进程编程

    千次阅读 2018-06-06 18:21:44
    3. gil使得同一时刻只有一个线程在cpu上执行字节码,无法将线程映射到个cpu上 4. gil会根据执行的字节码行数以及时间片 释放gil 5. gil在遇到io操作的时候会主动释放import threading total = 0 ...
  • python给爬虫加速:多线程多进程

    千次阅读 2019-04-25 14:57:10
    普通的python爬虫是单进程单线程的,这样在遇到大量重复...——答案是可以的,使用多进程/多线程,把每个带着不同参数下载器分给每个进程/线程就,然后同时跑多个进程/线程就行了。 本文就介绍如何用多线程多进程...
  • 多线程多进程的区别及适用场景

    千次阅读 2018-04-11 21:05:11
    对于多进程多线程,教科书上最经典的一句话是“进程是资源分配的最小单位,线程是CPU调度的最小单位”。多线程占相比于多进程占用内存少、CPU利用率高,创建销毁,切换都比较简单,速度很快。多进程相比于多线程...
  • 当然既然是都是 多这个字开头,那么就是多任务,我们需要...看上去⼀起执⾏⽽已)并⾏:指的是任务数⼩于等于cpu核数,即任务真的是⼀起执⾏的多线程(threading):①在⼀个进程内的所有线程共享全局变量,很⽅便...
  • 只好学习控制线程数了,官方文档不好看,觉得结构不够清晰,网上找很多文章也都不很清晰,只有for全开线程,没有控制线程数的具体说明,最终终于根据多篇文章和官方文档算是搞明白基础的多线程怎么实现法了,怕长...
  • 多进程以及多线程socket编程

    千次阅读 2017-06-23 11:40:28
    多进程多线程socket编程与单进程不同的只是服务器端的不同,客户端是一样的。 多进程:父进程fork子进程, 子进程退出,但是子进程的子进程仍在运行,变成了孤儿进程,由1号进程回收,父进程不用等待子进程的子...
  • 编程思想之多线程多进程(4)——C++中的多线程

    万次阅读 多人点赞 2015-07-10 21:48:18
    《编程思想之多线程多进程(1)——以操作系统的角度述说线程与进程》一文详细讲述了线程、进程的关系及在操作系统中的表现,《编程思想之多线程多进程(2)——线程优先级与线程安全》一文讲了线程安全(各种同步锁)...
  • 这篇文章是我从也是同网站的一个大神里面拷贝过来的,有什么不对的愿接受批评首先我们来了解下python中的进程线程以及协程!从计算机硬件角度:计算机的核心是CPU,承担了所有的计算任务。一个CPU,在一个时间切片...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 750,760
精华内容 300,304
关键字:

多进程多线程