【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调度的基本单位
  • 线程不是孤立执行,必须依存在进程之中


相关文章
|
2月前
|
数据采集 存储 JSON
Python爬取知乎评论:多线程与异步爬虫的性能优化
Python爬取知乎评论:多线程与异步爬虫的性能优化
|
2月前
|
人工智能 安全 调度
Python并发编程之线程同步详解
并发编程在Python中至关重要,线程同步确保多线程程序正确运行。本文详解线程同步机制,包括互斥锁、信号量、事件、条件变量和队列,探讨全局解释器锁(GIL)的影响及解决线程同步问题的最佳实践,如避免全局变量、使用线程安全数据结构、精细化锁的使用等。通过示例代码帮助开发者理解并提升多线程程序的性能与可靠性。
|
7月前
|
存储 Linux API
【Linux进程概念】—— 操作系统中的“生命体”,计算机里的“多线程”
在计算机系统的底层架构中,操作系统肩负着资源管理与任务调度的重任。当我们启动各类应用程序时,其背后复杂的运作机制便悄然展开。程序,作为静态的指令集合,如何在系统中实现动态执行?本文带你一探究竟!
【Linux进程概念】—— 操作系统中的“生命体”,计算机里的“多线程”
|
2月前
|
监控 编译器 Python
如何利用Python杀进程并保持驻留后台检测
本教程介绍如何使用Python编写进程监控与杀进程脚本,结合psutil库实现后台驻留、定时检测并强制终止指定进程。内容涵盖基础杀进程、多进程处理、自动退出机制、管理员权限启动及图形界面设计,并提供将脚本打包为exe的方法,适用于需持续清理顽固进程的场景。
|
2月前
|
数据采集 监控 调度
干货分享“用 多线程 爬取数据”:单线程 + 协程的效率反超 3 倍,这才是 Python 异步的正确打开方式
在 Python 爬虫中,多线程因 GIL 和切换开销效率低下,而协程通过用户态调度实现高并发,大幅提升爬取效率。本文详解协程原理、实战对比多线程性能,并提供最佳实践,助你掌握异步爬虫核心技术。
|
3月前
|
JSON 算法 Java
打造终端里的下载利器:Python实现可恢复式多线程下载器
在数字时代,大文件下载已成为日常需求。本文教你用Python打造专业级下载器,支持断点续传、多线程加速、速度限制等功能,显著提升终端下载体验。内容涵盖智能续传、多线程分块下载、限速控制及Rich库构建现代终端界面,助你从零构建高效下载工具。
187 1
|
2月前
|
数据采集 存储 Java
多线程Python爬虫:加速大规模学术文献采集
多线程Python爬虫:加速大规模学术文献采集
|
5月前
|
并行计算 Linux
Linux内核中的线程和进程实现详解
了解进程和线程如何工作,可以帮助我们更好地编写程序,充分利用多核CPU,实现并行计算,提高系统的响应速度和计算效能。记住,适当平衡进程和线程的使用,既要拥有独立空间的'兄弟',也需要在'家庭'中分享和并行的成员。对于这个世界,现在,你应该有一个全新的认识。
226 67
|
3月前
|
数据采集 网络协议 前端开发
Python多线程爬虫模板:从原理到实战的完整指南
多线程爬虫通过并发请求大幅提升数据采集效率,适用于大规模网页抓取。本文详解其原理与实现,涵盖任务队列、线程池、会话保持、异常处理、反爬对抗等核心技术,并提供可扩展的Python模板代码,助力高效稳定的数据采集实践。
137 0

热门文章

最新文章

推荐镜像

更多