精华内容
下载资源
问答
  • 一个进程下的多个线程
    千次阅读
    2021-04-10 10:26:02

    理论上,一个进程可用虚拟空间是2G,默认情况下,线程的栈的大小是1MB,所以理论上一个进程可以创建2048个线程,当然更改编译器的设置可以创建多余2048个线程

    因此,一个进程可以创建的线程数由可用虚拟空间和线程的栈的大小共同决定,只要虚拟空间足够,那么新线程的建立就会成功。如果需要创建超过2K以上的线程,减小你线程栈的大小就可以实现了,虽然在一般情况下,你不需要那么多的线程。过多的线程将会导致大量的时间浪费在线程切换上,给程序运行效率带来负面影响。

    更多相关内容
  • python多进程多线程,多个程序同时运行

    万次阅读 多人点赞 2021-04-08 13:47:15
    python 多线程进程同时运行 多任务要求 python 基础语法 python 文件目录操作 python 模块应用 开发工具 pycharm ...在段时间内交替执行多个任务, 例如单核cpu 处理多任务, 操作系统让各个任务交

    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 黑马程序员
    多进程多线程视频

    展开全文
  • 进程最多可以创建多少个线程

    万次阅读 多人点赞 2021-07-15 09:19:09
    大致意思就是,他看了一个面经,说虚拟内存是 2G 大小,然后他看了我的图解系统 PDF 里说虚拟内存是 4G,然后他就懵逼了。 其实他看这面经很有问题,没有说明是什么操作系统,以及是多少位操作系统。 因为不同的...

    大家好,我是小林。

    昨天有位读者问了我这么个问题:


    大致意思就是,他看了一个面经,说虚拟内存是 2G 大小,然后他看了我的图解系统 PDF 里说虚拟内存是 4G,然后他就懵逼了。

    其实他看这个面经很有问题,没有说明是什么操作系统,以及是多少位操作系统。

    因为不同的操作系统和不同位数的操作系统,虚拟内存可能是不一样多。

    Windows 系统我不了解,我就说说 Linux 系统。

    在 Linux 操作系统中,虚拟地址空间的内部又被分为内核空间和用户空间两部分,不同位数的系统,地址 空间的范围也不同。比如最常⻅的 32 位和 64 位系统,如下所示:

    通过这里可以看出:

    • 32 位系统的内核空间占用 1G ,位于最高处,剩下的 3G 是用户空间;
    • 64 位系统的内核空间和用户空间都是 128T ,分别占据整个内存空间的最高和最低处,剩下的中
      间部分是未定义的。

    接着,来看看读者那个面经题目:一个进程最多可以创建多少个线程?

    这个问题跟两个东西有关系:

    • 进程的虚拟内存空间上限,因为创建一个线程,操作系统需要为其分配一个栈空间,如果线程数量越多,所需的栈空间就要越大,那么虚拟内存就会占用的越多。
    • 系统参数限制,虽然 Linux 并没有内核参数来控制单个进程创建的最大线程个数,但是有系统级别的参数来控制整个系统的最大线程个数。

    我们先看看,在进程里创建一个线程需要消耗多少虚拟内存大小?

    我们可以执行 ulimit -a 这条命令,查看进程创建线程时默认分配的栈空间大小,比如我这台服务器默认分配给线程的栈空间大小为 8M。

    在前面我们知道,在 32 位 Linux 系统里,一个进程的虚拟空间是 4G,内核分走了1G,留给用户用的只有 3G

    那么假设创建一个线程需要占用 10M 虚拟内存,总共有 3G 虚拟内存可以使用。于是我们可以算出,最多可以创建差不多 300 个(3G/10M)左右的线程。

    如果你想自己做个实验,你可以找台 32 位的 Linux 系统运行下面这个代码:

    由于我手上没有 32 位的系统,我这里贴一个网上别人做的测试结果:

    如果想使得进程创建上千个线程,那么我们可以调整创建线程时分配的栈空间大小,比如调整为 512k:

    $ ulimit -s 512
    

    说完 32 位系统的情况,我们来看看 64 位系统里,一个进程能创建多少线程呢?

    我的测试服务器的配置:

    • 64 位系统;
    • 2G 物理内存;
    • 单核 CPU。

    64 位系统意味着用户空间的虚拟内存最大值是 128T,这个数值是很大的,如果按创建一个线程需占用 10M 栈空间的情况来算,那么理论上可以创建 128T/10M 个线程,也就是 1000多万个线程,有点魔幻!

    所以按 64 位系统的虚拟内存大小,理论上可以创建无数个线程。

    事实上,肯定创建不了那么多线程,除了虚拟内存的限制,还有系统的限制。

    比如下面这三个内核参数的大小,都会影响创建线程的上限:

    • /proc/sys/kernel/threads-max,表示系统支持的最大线程数,默认值是 14553
    • /proc/sys/kernel/pid_max,表示系统全局的 PID 号数值的限制,每一个进程或线程都有 ID,ID 的值超过这个数,进程或线程就会创建失败,默认值是 32768
    • /proc/sys/vm/max_map_count,表示限制一个进程可以拥有的VMA(虚拟内存区域)的数量,具体什么意思我也没搞清楚,反正如果它的值很小,也会导致创建线程失败,默认值是 65530

    那接下针对我的测试服务器的配置,看下一个进程最多能创建多少个线程呢?

    我在这台服务器跑了前面的程序,其结果如下:

    可以看到,创建了 14374 个线程后,就无法在创建了,而且报错是因为资源的限制。

    前面我提到的 threads-max 内核参数,它是限制系统里最大线程数,默认值是 14553。

    我们可以运行那个测试线程数的程序后,看下当前系统的线程数是多少,可以通过 top -H 查看。

    左上角的 Threads 的数量显示是 14553,与 threads-max 内核参数的值相同,所以我们可以认为是因为这个参数导致无法继续创建线程。

    那么,我们可以把 threads-max 参数设置成 99999:

    echo 99999 > /proc/sys/kernel/threads-max
    

    设置完 threads-max 参数后,我们重新跑测试线程数的程序,运行后结果如下图:

    可以看到,当进程创建了 32326 个线程后,就无法继续创建里,且报错是无法继续申请内存。

    此时的上限个数很接近 pid_max 内核参数的默认值(32768),那么我们可以尝试将这个参数设置为 99999:

    echo 99999 > /proc/sys/kernel/pid_max
    

    设置完 pid_max 参数后,继续跑测试线程数的程序,运行后结果创建线程的个数还是一样卡在了 32768 了。

    当时我也挺疑惑的,明明 pid_max 已经调整大后,为什么线程个数还是上不去呢?

    后面经过查阅资料发现,max_map_count 这个内核参数也是需要调大的,但是它的数值与最大线程数之间有什么关系,我也不太明白,只是知道它的值是会限制创建线程个数的上限。

    然后,我把 max_map_count 内核参数也设置成后 99999:

    echo 99999 > /proc/sys/kernel/max_map_count 
    

    继续跑测试线程数的程序,结果如下图:

    当创建差不多 5 万个线程后,我的服务器就卡住不动了,CPU 都已经被占满了,毕竟这个是单核 CPU,所以现在是 CPU 的瓶颈了。

    我只有这台服务器,如果你们有性能更强的服务器来测试的话,有兴趣的小伙伴可以去测试下。

    接下来,我们换个思路测试下,把创建线程时分配的栈空间调大,比如调大为 100M,在大就会创建线程失败。

    ulimit -s 1024000
    

    设置完后,跑测试线程的程序,其结果如下:

    总共创建了 26390 个线程,然后就无法继续创建了,而且该进程的虚拟内存空间已经高达 25T,要知道这台服务器的物理内存才 2G。

    为什么物理内存只有 2G,进程的虚拟内存却可以使用 25T 呢?

    因为虚拟内存并不是全部都映射到物理内存的,程序是有局部性的特性,也就是某一个时间只会执行部分代码,所以只需要映射这部分程序就好。

    你可以从上面那个 top 的截图看到,虽然进程虚拟空间很大,但是物理内存(RES)只有使用了 400 多M。

    好了,简单总结下:

    • 32 位系统,用户态的虚拟空间只有 3G,如果创建线程时分配的栈空间是 10M,那么一个进程最多只能创建 300 个左右的线程。
    • 64 位系统,用户态的虚拟空间大到有 128T,理论上不会受虚拟内存大小的限制,而会受系统的参数或性能限制。

    絮叨絮叨

    小林在 CSDN 写了很多图解网络和操作系统的系列文章,很高兴收获到很朋友的认可和支持,正好最近图解网络和操作系统的文章连载的有 20+ 篇了,也算有个体系了。

    在这里插入图片描述

    所以为了方便大家阅读,小林把自己原创的图解网络和图解操作系统整理成了 PDF,一整理后,没想到每个图解都输出了 15 万字 + 500 张图,质量也是杠杠的,有很多朋友特地私信我,看了我的图解拿到了大厂的offer。

    图解系统 PDF 开源下载:图解系统 PDF 下载地址(点击)

    图解网络 PDF 开源下载:图解网络 PDF 下载地址(点击)


    我是小林,今天的你,比昨天更博学了吗?

    展开全文
  • 再后来,CPU厂商为每个CPU核心配置了MMU,这个时候的CPU就能同时运行多个进程多个线程。 后来又出现了超线程技术,比如inter的i3-5005u就是个双核四线程的CPU,这个CPU就能同时运行四个进程,或者同时运行四个...

    这个得分情况讨论,如果是以前单核时代的CPU,那只能同时运行一个进程或者一个线程,因为这个时代的CPU只有一个MMU。
    后来出现了多核CPU,假如现在有一个双核CPU,那这个CPU就能同时运行两个线程,但仍然只能同时运行一个进程,因为这个双核CPU仍然只有一个MMU。
    再后来,CPU厂商为每个CPU核心配置了MMU,这个时候的CPU就能同时运行多个进程和多个线程。
    后来又出现了超线程技术,比如inter的i3-5005u就是一个双核四线程的CPU,这个CPU就能同时运行四个进程,或者同时运行四个线程。

    展开全文
  • 进程包括由操作系统分配的内存空间,包含个或多个线程个线程不能独立的存在,它必须是进程部分。进程一直运行,直到所有的非守护线程都结束运行后才能结束。 线程  又称其为轻量级进程...
  • 进程和多线程的主要区别是:线程是进程的子集(部分),进程可能由多个线程组成。多进程的数据是分开的、共享复杂,需要用IPC;但同步简单。多线程共享进程数据,共享简单;但同步复杂。  多进程,Windows...
  • 进程 vs 线程 :进程可以包含多个线程

    万次阅读 多人点赞 2016-09-18 21:15:50
    进程(process)和线程(thread)是操作系统的基本概念,但是...vs 线程 :进程可以包含多个线程" title="进程 vs 线程 :进程可以包含多个线程" style="border:0px; max-width:602px; height:auto; ma
  • 进程线程的区别(超详细)

    万次阅读 多人点赞 2019-10-03 21:57:46
    每个进程都有自己独立的块内存空间,进程可以有多个线程,比如在Windows系统中,个运行的xx.exe就是进程。 线程 进程中的个执行任务(控制单元),负责当前进程中程序的执行。进程至少有个线程...
  • 一个进程所拥有的数据和变量只属于它自己。 线程(thread):是进程内相对独立的可执行单元,所以也被称为轻量进程(lightweight processes);是操作系统进行任务调度的基本单元。它与父进程的其它线程共享该进程所...
  • 一个进程都有它自己的地址空间,一般情况,包括文本区域(text region)、数据区域(data region)和堆栈(stack region)。 第二,进程一个“执行中的程序”。程序是一个没有生命的实体,只有处理器赋予程序...
  • 什么是进程,什么是线程,多线程与多进程的区别?什么是进程,什么是线程线程与多进程的区别 什么是进程,什么是线程 什么是进程,什么是线程,以及...  首先明确多进程和多线程都能“同时实现多个任务”。假设要同
  • 、Python多进程多线程 关于python多进程多线程的相关基础知识,在我之前的博客有写过,并且就关于python多线程的GIL锁问题,也在我的篇博客中有相关的解释。 为什么python多线程在面对IO密集型任务的时候会产生...
  • 多线程多进程

    千次阅读 2019-02-27 10:26:49
    多线程共享进程数据:共享简单;同步复杂 各有优势 内存、CPU 占用内存,切换复杂,CPU利用率低 占用内存少,切换简单,CPU利用率高 线程占优 创建销毁、切换 创建销毁、切换复杂,速度慢 创建...
  • 如果实现客户端与服务器的交互比较容易(直接用TCP的编程流程就可以实现,只是这样写出的程序只能是个客户端交互释放连接后其他客户端才可以与服务器交互 ),但是要实现多个客户端同时与同一服务器的交互就相对...
  • 进程多线程vs多进程单线程

    千次阅读 2019-10-16 16:15:10
    进程和线程的概念 进程:运行中的应用程序称为进程,拥有系统资源(cpu、内存) ...2、创建或撤销进程所需要的开销比创建或撤销一个线程所需要的开销大。 3、进程为重量级组件,线程为轻量级组件 ...
  • Python 多进程多线程启动

    万次阅读 2021-02-22 12:52:49
    Python 多进程启动 def main(self, num): """ 多进程启动 ValueError: Pool not running:这问题的根源在于:pool.close()提前生效,关闭了pool。所以提示pool没有运行。 解决:多层循环的情况,将pool....
  • 线程进程多线程多进程任务 小结

    千次阅读 多人点赞 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 ...
  • 一个进程能运行多少线程

    千次阅读 2019-04-11 15:22:41
    也知道线程的概念,它是程序执行的最小单元,是进程中的个实体用来执行程序,进程中有多个线程。(个cpu内核只能运行进程/线程,台8核cpu的服务器只能同时运行8个进程/线程。只是每个进...
  • 【Linux】多进程多线程的理解及优缺点

    千次阅读 多人点赞 2021-03-21 21:17:49
    线程是进程中的条执行流,是CPU执行调度的基本单位,进程中可以有多个线程。在Linux,线程执行流是通过PCB实现的,且进程中可能有多个PCB,这些PCB共享同进程中大部分资源,也可以将其称作轻量级...
  • 进程线程

    千次阅读 2021-05-08 15:49:53
    进程由几个线程组成(拥有很相对独立的执行流的用户程序共享应用程序的大部分数据结构) 线程与同属进程的其他的线程共享进程所拥有的全部资源。 “进程——资源分配的最小单位,线程——程序执行的最小...
  • windows如何查看某个进程有多少个线程,及各个线程的CPU、名称等详细信息
  • 进程线程

    万次阅读 多人点赞 2021-03-17 22:50:20
    进程线程 1 进程 1.1 进程的概念 进程就是正在运行的程序,它代表了程序所占用的内存区域 1.2 进程的特点 独立性 进程是系统中独立存在的实体,它可以拥有自己独立的资源,每个进程都拥有自己私有的...多个进程可以在
  • 本文介绍种在PHP中解决多进程多线程同时读写同一个文件的问题。
  • Python之多进程多线程

    千次阅读 2019-08-16 15:03:42
    前言:为什么有人说 Python 的多线程是鸡肋,不是真正意义上的多线程? 看到这里,也许你会疑惑。这很正常,所以让我们带着问题来阅读本文章吧。问题: 1、Python多线程为什么...线程一个基本的CPU执行单元。...
  • 进程线程的分配策略【杂记】

    千次阅读 2022-02-08 19:02:33
    进程线程的分配策略【杂记】
  • 面试必问问题之多进程多线程的区别(超详细)

    千次阅读 多人点赞 2020-06-01 00:05:10
    在多道程序同时运行的环境,允许多个程序并发执行,此时他们将失去封闭性,并具有间断性及不可再现性的特征,程序本身是组执行特定功能的指令的集合,是个静态的概念,无法描述程序在内存中何时执行,何时停
  • Linux下多个进程线程同时对个文件进行写操作  Linux下多个进程线程同时对个文件进行写操作,如何解决冲突? 使用flock(锁定文件或解除锁定),简单可行! 先介绍一下flock函数吧 头文件 #...
  • 1. 什么是进程线程 现代操作系统比如Mac OS X,UNIX,Linux,Windows等,都是支持“任务”的操作系统。 1.1 百科解释 进程(Process)是计算机中的程序关于某数据集合上的次运行活动,是系统进行资源分配和...
  • 进程线程、协程

    千次阅读 2021-08-28 23:44:33
    进程、线程、协程 、概念与区分 1、进程 进程是程序次动态执行的过程,是程序运行的基本单位。 每个进程都有自己的独立内存空间,不同进程通过进程...多个线程共享所属进程的资源,同时线程也拥有自己的专属资源。
  • Python之多进程多线程详解

    万次阅读 多人点赞 2018-10-16 18:02:56
    进程:表示的一个正在执行的程序。 每个进程都拥有自己的地址空间、内存、数据栈以及其他用于跟踪执行的辅助数据 操作系统负责其上所有进程的执行,操作系统会为这些进程合理地分配执行时间。 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 830,617
精华内容 332,246
热门标签
关键字:

一个进程下的多个线程