【博学谷学习记录】超强总结,用心分享 | 进程和线程的使用

【博学谷IT技术支持】

一、介绍

进程:进程是资源分配最小单位;进程之间的资源是独立的;进程有自己独立的地址空间,每启动一个进程,系统都会为其分配地址空间;进程是可以并行执行的计算;一个程序可以执行多个进程,一个进程也可以执行多个程序;

线程:线程是程序执行的最小单位。一个进程有多个线程组成;线程没有独立的地址空间,同一进程的线程共享本进程的地址空间。

二、使用

python中进程使用multiprocessing

multiprocessing的使用

正常情况下,定义两个函数,然后通过调用输出,如果函数中有输出,那么应该是先执行第一个调用函数的输出,再执行第二个,有先后顺序。

import time


def fun1():
    for i in range(3):
        print(f'你好: {i}')
        time.sleep(0.5)


def fun2():
    for i in range(3):
        print(f'我好: {i}')
        time.sleep(0.5)


if __name__ == '__main__':
    fun1()
    fun2()

image.png

并发

  • 导入multiprocessing
  • 通过进程类创建进程对象,该方法有参数,分别是target和参数,target指调用的函数,参数可以有args,args以元组形式传参,传参要注意前后顺序,kwargs以字典形成传参,需要参数命名一致。
  • 启动进程执行任务
import time
import multiprocessing


def fun1(num):
    for i in range(num):
        print(f'你好: {i}')
        time.sleep(0.5)


def fun2(num):
    for i in range(num):
        print(f'我好: {i}')
        time.sleep(0.5)


if __name__ == '__main__':
    fun1_process = multiprocessing.Process(target=fun1, args=(3,))
    fun2_process = multiprocessing.Process(target=fun2, kwargs={'num': 3})
    fun1_process.start()
    fun2_process.start()

执行结果

image.png

threading的使用

  • 导入线程模块
  • 通过线程类创建线程对象。该方法有参数,分别是target和参数,target指调用的函数,参数可以有args,args以元组形式传参,传参要注意前后顺序,kwargs以字典形成传参,需要参数命名一致。
  • 启动线程执行任务
import time
import multiprocessing
import threading


def fun1(num):
    for i in range(num):
        print(f'你好: {i}')
        time.sleep(0.5)


def fun2(num):
    for i in range(num):
        print(f'我好: {i}')
        time.sleep(0.5)


if __name__ == '__main__':
    # fun1_process = multiprocessing.Process(target=fun1, args=(3,))
    # fun2_process = multiprocessing.Process(target=fun2, kwargs={'num': 3})
    # fun1_process.start()
    # fun2_process.start()

    fun1_process = threading.Thread(target=fun1, args=(3,))
    fun2_process = threading.Thread(target=fun2, kwargs={'num': 3})
    fun1_process.start()
    fun2_process.start()

执行结果

image.png

设置主线程守护和子线程守护

在正常的处理中,子进程并不会因为主进程的结束而结束,他还是会继续执行,这里就需要设置线程守护,在主进程退出后子进程直接销毁,不在执行子进程的代码。

进程的设置

// 设进程启动前
进程.daemon = True

线程的设置

// 设进程启动前
// 第一种
fun1_process = threading.Thread(target=fun1, daemon=True)

// 第二种
fun1_process.daemon(True)

三、总结

  • 进程是资源分配最小单位,线程是程序执行的最小单位。
  • 一个进程有多个线程组成;线程没有独立的地址空间,同一进程的线程共享本进程的地址空间。
  • 创建进程的资源开销要比线程大。进程可以使用多核,线程只能单核。
  • 线程间的执行顺序是无序的,由CPU调度决定某个线程先执行。 可通过current_thread()获取线程对象,输出查看
posted @ 2023-01-30 09:12  牛牛牛牛牛牛牛牛  阅读(23)  评论(0编辑  收藏  举报