前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >进程和线程的关系?玩转python多线程

进程和线程的关系?玩转python多线程

作者头像
神的孩子都在歌唱
发布2025-03-05 20:23:12
发布2025-03-05 20:23:12
1200
代码可运行
举报
运行总次数:0
代码可运行

玩转python多线程

前言:

这是我看了这位b站老师做的笔记,听课完后觉得很简单,感觉我这笔记还写得有点啰嗦,线程和进程原理差不多,看了进程就可以跳着看线程了(反正我是这样的,哈哈)

一. 多任务介绍

  1. 1. 多任务:同一时间打开多个任务。比如一台计算机上同时打开百度,和谷歌
  2. 2. 并发 :在一段时间内 交替 去执行多个任务。比如对于单核cpu处理多任务,操作系统轮流让各个任务交替执行
在这里插入图片描述
在这里插入图片描述
  1. 3. 并行: 在一段时间内真正的同时一起 执行多个任务。

二. 进程

2.1 进程的介绍

python中可以使用多进程 来实现多任务

  1. 1. 进程的概念:是资源的最小单位,,它是操作系统进行资源分配调度运行的基本单位。通俗理解:一个正在运行的程序就是一个进程。例如qq等,都是一个进程
  2. 2. 多进程作用
  1. 3. 进程在python中的创建步骤:
代码语言:javascript
代码运行次数:0
复制
#1. 导包
import multiprocessing
#2. 通过进程类创建进程对象
进程对象=multiprocessing.Process(target=任务名)
#3. 启动进程执行任务
进程对象.start()

练习:

代码语言:javascript
代码运行次数:0
复制
import multiprocessing
import  time

#创建两个任务

defsing():
    for i inrange(3):
        print('唱歌...')
        time.sleep(1.5)
defdance():
    for i inrange(3):
        print('跳舞..')
        time.sleep(1.5)

if __name__=='__main__':#main是主进程
    #使用进程类创0建进程对象
    #target指定执行函数名.记住:一定要指定
    sing_process=multiprocessing.Process(target=sing)
    dance_process=multiprocessing.Process(target=dance)
    #使用进程对象启动进程执行指定任务
    sing_process.start()
    dance_process.start()
'''输出
唱歌...
跳舞..
唱歌...
跳舞..
唱歌...
跳舞..

'''
2.2 进程执行带有参数的任务

练习:将上面代码3改为num

代码语言:javascript
代码运行次数:0
复制
import multiprocessing
import  time
#创建两个任务
defsing(num):
    for i inrange(num):
        print('唱歌...')
        time.sleep(1.5)
defdance():
    for i inrange(num):
        print('跳舞..')
        time.sleep(1.5)
if __name__=='__main__':
    sing_process=multiprocessing.Process(target=sing,args=(3,))#按照参数顺序
    dance_process=multiprocessing.Process(target=dance,kwargs={"num":2})#保证参数名一致就行
    #使用进程对象启动进程执行指定任务
    sing_process.start()
    dance_process.start()
    '''
    跟上述代码输出一样
    '''
2.3 获取进程编号

作用:当程序进程多时,没办法区分主进程和子进程,为了方便管理给每个进程设定编号

注意:需要导入os包 获取当前进程编号:os.getpid 获取父进程编号:os.getppid

代码语言:javascript
代码运行次数:0
复制
import multiprocessing
import  time
import os#导入os
#创建两个任务

defsing():
        print('唱歌...')
        print("当前唱歌进程编号",os.getpid())
        print("获取父进程编号",os.getppid())
        time.sleep(1.5)

if __name__=='__main__':
    #使用进程类创0建进程对象
    #target指定执行函数名.记住:一定要指定
    print("当前主机进程编号",os.getpid())
    sing_process=multiprocessing.Process(target=sing)
    #使用进程对象启动进程执行指定任务
    sing_process.start()
    '''输出
    当前主机进程编号 7744
    唱歌...
    当前唱歌进程编号 20328
    获取父进程编号 7744
    '''
2.4 守护进程

听到守护,是不是想到你那个夜晚对呀发誓要守护她一生一世

这里的守护可不一样

让我们来看看守护进程是什么:


  1. 1. 一般情况下,主进程会等待子进程执行完后在结束,那么如何设置主进程结束子进程也结束,不再执行代码呢?
  2. 2. 设置守护主进程方式:子进程对象.daemon=True
  3. 3. 不多说,上代码
代码语言:javascript
代码运行次数:0
复制
import multiprocessing
import time

defwork():
    for i inrange(10):
        print("工作中。。。")
        time.sleep(0.2)
if __name__=='__main__':
    #创建子进程
    sum_process=multiprocessing.Process(target=work)
    sum_process.daemon=True#设置守护主进程,主进程退出后子进程直接销毁,不在执行
    sum_process.start()
    time.sleep(1)
    print("主进程执行完成")
    '''输出
    工作中。。。
    工作中。。。
    工作中。。。
    工作中。。。
    工作中。。。
    主进程执行完成
    '''

你们可以去掉守护进程自己去试一下,后面还会运行子进程

三. 线程

3.1 线程介绍

在python中还可以使用多线程完成多任务

为什么使用

  1. 1. 进程是分配资源的最小单位, 一旦创建一个进程就会分配一定的资源,就像跟两个人聊QQ就需要打开两个QQ软件-样是比较浪费资源的.
  2. 2. 线程是程序执行的最小单位,实际上进程只负责分配资源,而利用这些资源执行程序的是线程,也就说进程是线程的容器,一个进程中最少有一个线程来负责执行程序.同时线程自己不拥有系统资源,只需要一点儿在运行中必不可少的资源,但它可与同属一一个进程的其它线程共享进程所拥有的全部资源。这就像通过一个QQ软件(一个进程)打开两个窗口(两个线程)跟两个人聊天一样,实现多任务的同时也节省了资源.

总结:

(1)线程是程序执行的最小单位. (2)同属一个进程的多个线程共享进程所拥有的全部资源.

3.2 创建步骤
  1. 1. 导入线程模块
代码语言:javascript
代码运行次数:0
复制
import threading
  1. 2. 通过线程类创建线程对象
代码语言:javascript
代码运行次数:0
复制
线程对象=threading.Thread(target=任务名)
  1. 3. 启动线程执行任务
代码语言:javascript
代码运行次数:0
复制
线程对象.start()

代码实例

代码语言:javascript
代码运行次数:0
复制
import threading
import  time

#创建两个任务

defsing():
    for i inrange(3):
        print('唱歌...')
        time.sleep(1.5)
defdance():
    for i inrange(3):
        print('跳舞..')
        time.sleep(1.5)

if __name__=='__main__':
    #使用进程类创0建进程对象
    #target指定执行函数名.记住:一定要指定
    sing_process=threading.Thread(target=sing)
    dance_process=threading.Thread(target=dance)
    #使用进程对象启动进程执行指定任务
    sing_process.start()
    dance_process.start()

代码解析:跟进程不同,唱歌跳舞是同时出现的,遍历了三次

3.3 守护线程
  1. 1. 主线程会等待所有的子线程执行结束再结束,除非设置子线程守护主线程
  2. 2. 设置守护主线程有两种方式:

(1)threading.Thread(target=work, daemon=True)

(2)线程对象.setDaemon(True)

差不多跟进程一样,就不上代码了

3.4 多进程执行顺序

介绍:多进程执行时无序的,是由cpu调度决定某个线程先执行的

上代码

代码语言:javascript
代码运行次数:0
复制
import threading
import time

def task():
    time.sleep(2)
    #current_thread():获取当前线程的线程对象
    thread=threading.current_thread()
    print(thread)
if __name__== '__main__':
    for i in range(5):
        sub_thread=threading.Thread(target=task)
        sub_thread.start()
 '''输出
 <Thread(Thread-2, started 12040)>
<Thread(Thread-3, started 3856)>
<Thread(Thread-1, started 20524)>
<Thread(Thread-4, started 7800)>
<Thread(Thread-5, started 20360)>
 '''

我们可以看到,输出的是23145,顺序是被打乱的,所以多进程是无序的

四. 进程和线程对比

1.关系对比 (1)线程是依附于进程的,没有进程就没线程 (2)一个进程默认提供一条线程,进程可以创建多个线程

  1. 2. 区别对比 (1)创建进程开销比线程大 (2)进程操作系统资源分配的基本单位,线程cpu调度的基本单位 (3)线程需要依附进程才可以运行
  2. 3. 优缺点对比

(1)线程可以用多核,进程不能 (2)开销的大小

作者:神的孩子都在歌唱 本人博客:https://blog.csdn.net/weixin_46654114 转载说明:务必注明来源,附带本人博客连接

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2025-02-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 神的孩子都在歌唱 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 玩转python多线程
    • 一. 多任务介绍
    • 二. 进程
    • 三. 线程
    • 四. 进程和线程对比
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档