【python】-详解进程与线程

简介: 【python】-详解进程与线程

进程

1、多任务

(1)概念:同一时间执行多个任务,打开QQ的同时也可以打开微信

(2)作用:充分利用CPU资源,提高程序的执行效率

(3)表现形式:

  • 并发:在一段时间内交替去执行多个任务(对于单核CPU处理)
  • 并行:在一段时间内真正的同时一起执行多个任务(对于多核CPU)

2、进程介绍

(1)概念:进程是资源分配的最小单位,它是操作系统进行资源分配和调度运行的基本单位。也即

一个正在运行的程序就是一个进程

3、多进程

1 进程的创建步骤
  • 导入进程包
  • import multiprocessing
  • 通过进程类创建进程对象
    进程对象=multiprocessing.Process()
  • 启动进程执行任务
    进程对象.start()
2 通过进程类创建进程对象
进程对象=multiprocessing.Process(target=任务名)

3 进程的创建与启动代码
###单任务
import time
'''
以下这种形式就是先唱完歌才能接着跳舞
共执行的时间是:3s
'''

#唱歌
def sing():
    for i in range (3):
        print("唱歌。。。。")
        time.sleep(0.5)

#跳舞
def dance():
    for i in range(3):
        print("跳舞。。。。")
        time.sleep(0.5)

if __name__ == '__main__':
    time_start=time.time()
    sing()
    dance()
    time_end=time.time()
    print("共耗费:",time_end-time_start)

'''
唱歌。。。。
唱歌。。。。
跳舞。。。。
跳舞。。。。
跳舞。。。。
共耗费: 3.0499579906463623
'''


#多任务多进程
import time
#1、导入进程包
import multiprocessing
'''
1、导入进程包
2、使用进程类创建进程对象
3、使用进程对象启动进程执行任务

'''
#唱歌
def sing():
    for i in range (3):
        print("唱歌。。。。")
        time.sleep(0.5)

#跳舞
def dance():
    for i in range(3):
        print("跳舞。。。。")
        time.sleep(0.5)



if __name__ == '__main__':
    time_start = time.time()

    #2、使用进程类创建进程对象
    sing_process=multiprocessing.Process(target=sing)
    dance_process=multiprocessing.Process(target=dance)
    #3、使用进程对象启动进程执行任务
    sing_process.start()
    dance_process.start()

    time_end = time.time()
    print("共耗费:", time_end - time_start)
'''
唱歌跳舞同时进行
共耗费: 0.016045808792114258
唱歌。。。。
跳舞。。。。
跳舞。。。。
唱歌。。。。
唱歌。。。。
跳舞。。。。
'''

4、进程执行带有参数的任务

1 进程执行带有参数的任务

2 args 参数的使用
  • 多参数的时候,需要按照顺序

3 kwargs 参数的使用
  • 字典的键要与传的参数一致
  • 不需要按照顺序执行

4 代码实现
import time
#1、导入进程包
import multiprocessing
'''
1、导入进程包
2、使用进程类创建进程对象
3、使用进程对象启动进程执行任务

'''
#唱歌
def sing(num,name):
    for i in range (num):
        print("{} :唱歌。。。。{}".format(name,i))
        time.sleep(0.5)
#跳舞
def dance(num,name):
    for i in range(num):
        print("{}:跳舞。。。。{}".format(name,i))
        time.sleep(0.5)
if __name__ == '__main__':
    time_start = time.time()
    #2、使用进程类创建进程对象
    sing_process=multiprocessing.Process(target=sing,args=(3,"蔡徐坤"))
    dance_process=multiprocessing.Process(target=dance,kwargs={'name':"吴亦凡",'num':3})
    #3、使用进程对象启动进程执行任务
    sing_process.start()
    dance_process.start()
    time_end = time.time()
    print("共耗费:", time_end - time_start)

5 获取进程编号

作用:当进程的数量越来越多,如果没有办法区分主进程和子进程,无法进行有效的进程管理。

获取进程的编号:

  • 获取当前进程编号
    os.getpid()
  • 获取当前父进程编号
    os.getppid()
1 os.getpid()的使用

2 os.getppid()的使用

3 代码实现
def sing(num,name):
    print("唱歌进程的pid:",os.getpid())
    print("唱歌进程的父进程pid:", os.getppid())
def dance(num,name):
    print("跳舞进程的pid:", os.getpid())
    print("跳舞进程的父进程:", os.getppid())
if __name__ == '__main__':
    print("主进程的pid:",os.getpid())
'''
主进程的pid: 52044
唱歌进程的父进程pid: 52044
跳舞进程的父进程pid: 52044
'''
4 注意点
  • 主进程会等待所有的子进程执行结束后再使用
  • 设置守护主进程:主进程退出后直接销毁,不再执行子进程中的代码
  • work_process.daemon=True
def work():
    for i in range(10):
        print("工作中....")
        time.sleep(0.2)

if __name__ == '__main__':
    work_press=multiprocessing.Process(target=work)
    work_press.daemon=True
    work_press.start()
    time.sleep(2)
    print("主进程工作中...")
'''
工作中....
工作中....
工作中....
工作中....
工作中....
主进程工作中...
'''

线程

1 线程的介绍

进程是分配资源的最小单位,一旦创建一个进程就会分配一定的资源,就像两人聊QQ需要打开两个QQ软件一样,一样浪费资源。

线程是程序执行的最小的单位。进程是只负责分配资源,而利用资源执行程序的是线程。进程是线程的容器,一个进程中最少有一个线程来负者执行程序。线程不需要中间拥有系统资源,只需要一点在运行中必不可少的资源,同一个进程的其他线程共享所拥有的全部资源。好比QQ软件(进程)打开两个窗口(两个线程)跟两个人聊天。

从上面两张图片可以看出,进程看成两个人干两件事(打开QQ、微信),线程是一个人干两件事(分别找两个人聊天)。

2 多线程完成多任务

1 线程的创建步骤
  • 导入线程模块
    - import threading
  • 通过线程类创建线程对象
    - 线程对象=threading.Thread(target=任务名)

  • 启动线程执行任务
    线程对象.start()
2 线程的创建与启动的代码

if __name__ == '__main__':
    sing_thread=threading.Thread(target=sing)
    dance_thread=threading.Thread(target=dance)
    sing_thread.start()
    dance_thread.start()

3 线程执行带有参数的任务

与进程的创建方法一样,就不写了

4 主线程与子线程的结束顺序

  • 设置守护主线程方式1:
work_press=threading.Thread(target=work,daemon=True)

方式2:

work_press.setDaemon(True)

5 线程 间的执行顺序

1 线程之间的执行顺序是 无序的 ,是由CPU随机调度的

2 获取当前的线程信息

6 进程和线程的对比

1 关系对比
  • 线程是依附在进程里面的,没有进程就没有线程
  • 一个进程默认提供一条线程,进程可以创建多个线程
2 区别对比
  • 创建进程的开销要比创建线程的开销大
  • 进程是操作系统资源分配的基本单位,线程是CPU调度的基本单位
  • 线程不是孤立执行,必须依存在进程之中


相关文章
|
26天前
|
消息中间件 并行计算 安全
进程、线程、协程
【10月更文挑战第16天】进程、线程和协程是计算机程序执行的三种基本形式。进程是操作系统资源分配和调度的基本单位,具有独立的内存空间,稳定性高但资源消耗大。线程是进程内的执行单元,共享内存,轻量级且并发性好,但同步复杂。协程是用户态的轻量级调度单位,适用于高并发和IO密集型任务,资源消耗最小,但不支持多核并行。
40 1
|
23天前
|
安全 数据处理 开发者
Python中的多线程编程:从入门到精通
本文将深入探讨Python中的多线程编程,包括其基本原理、应用场景、实现方法以及常见问题和解决方案。通过本文的学习,读者将对Python多线程编程有一个全面的认识,能够在实际项目中灵活运用。
|
5天前
|
并行计算 数据处理 调度
Python中的并发编程:探索多线程与多进程的奥秘####
本文深入探讨了Python中并发编程的两种主要方式——多线程与多进程,通过对比分析它们的工作原理、适用场景及性能差异,揭示了在不同应用需求下如何合理选择并发模型。文章首先简述了并发编程的基本概念,随后详细阐述了Python中多线程与多进程的实现机制,包括GIL(全局解释器锁)对多线程的影响以及多进程的独立内存空间特性。最后,通过实例演示了如何在Python项目中有效利用多线程和多进程提升程序性能。 ####
|
10天前
|
Linux 调度 C语言
深入理解操作系统:进程和线程的管理
【10月更文挑战第32天】本文旨在通过浅显易懂的语言和实际代码示例,带领读者探索操作系统中进程与线程的奥秘。我们将从基础知识出发,逐步深入到它们在操作系统中的实现和管理机制,最终通过实践加深对这一核心概念的理解。无论你是编程新手还是希望复习相关知识的资深开发者,这篇文章都将为你提供有价值的见解。
|
7天前
|
Java
java小知识—进程和线程
进程 进程是程序的一次执行过程,是系统运行的基本单位,因此进程是动态的。系统运行一个程序即是一个进程从创建,运行到消亡的过程。简单来说,一个进程就是一个执行中的程序,它在计算机中一个指令接着一个指令地执行着,同时,每个进程还占有某些系统资源如CPU时间,内存空间,文件,文件,输入输出设备的使用权等等。换句话说,当程序在执行时,将会被操作系统载入内存中。 线程 线程,与进程相似,但线程是一个比进程更小的执行单位。一个进程在其执行的过程中产生多个线程。与进程不同的是同类的多个线程共享同一块内存空间和一组系统资源,所以系统在产生一个线程,或是在各个线程之间做切换工作时,负担要比
17 1
|
12天前
深入理解操作系统:进程与线程的管理
【10月更文挑战第30天】操作系统是计算机系统的核心,它负责管理计算机硬件资源,为应用程序提供基础服务。本文将深入探讨操作系统中进程和线程的概念、区别以及它们在资源管理中的作用。通过本文的学习,读者将能够更好地理解操作系统的工作原理,并掌握进程和线程的管理技巧。
27 2
|
14天前
|
调度 Python
深入浅出操作系统:进程与线程的奥秘
【10月更文挑战第28天】在数字世界的幕后,操作系统悄无声息地扮演着关键角色。本文将拨开迷雾,深入探讨操作系统中的两个基本概念——进程和线程。我们将通过生动的比喻和直观的解释,揭示它们之间的差异与联系,并展示如何在实际应用中灵活运用这些知识。准备好了吗?让我们开始这段揭秘之旅!
|
17天前
|
Java Unix 调度
python多线程!
本文介绍了线程的基本概念、多线程技术、线程的创建与管理、线程间的通信与同步机制,以及线程池和队列模块的使用。文章详细讲解了如何使用 `_thread` 和 `threading` 模块创建和管理线程,介绍了线程锁 `Lock` 的作用和使用方法,解决了多线程环境下的数据共享问题。此外,还介绍了 `Timer` 定时器和 `ThreadPoolExecutor` 线程池的使用,最后通过一个具体的案例展示了如何使用多线程爬取电影票房数据。文章还对比了进程和线程的优缺点,并讨论了计算密集型和IO密集型任务的适用场景。
37 4
|
17天前
|
调度 iOS开发 MacOS
python多进程一文够了!!!
本文介绍了高效编程中的多任务原理及其在Python中的实现。主要内容包括多任务的概念、单核和多核CPU的多任务实现、并发与并行的区别、多任务的实现方式(多进程、多线程、协程等)。详细讲解了进程的概念、使用方法、全局变量在多个子进程中的共享问题、启动大量子进程的方法、进程间通信(队列、字典、列表共享)、生产者消费者模型的实现,以及一个实际案例——抓取斗图网站的图片。通过这些内容,读者可以深入理解多任务编程的原理和实践技巧。
41 1
|
24天前
|
Python
Python中的多线程与多进程
本文将探讨Python中多线程和多进程的基本概念、使用场景以及实现方式。通过对比分析,我们将了解何时使用多线程或多进程更为合适,并提供一些实用的代码示例来帮助读者更好地理解这两种并发编程技术。

热门文章

最新文章