天天看点

python多进程与多线程

作者:牛鹭软件测试
python多进程与多线程

多任务

python多任务可以使用多进程或多线程完成。那什么是多任务了?如百度网盘下载东西,我们可以同时下载多个东西,即多个任务同时进行。

多任务是指在同一时间内执行多个任务

python多进程与多线程

多任务的表现形式

1. 并发

在一段时间内交替去执行多个任务。

例子:对于单核cpu处理多任务,操作系统轮流让各个任务交替执行。

python多进程与多线程

2. 并行

在一段时间内真正的同时一起执行多个任务。

例子:对于多核cpu处理多任务,操作系统会给cpu的每个内核安排一个执行的任务,多个内核是真正的一起同时执行多个任务。这里需要注意多核cpu是并行的执行多任务,始终有多个任务一起执行。

python多进程与多线程

什么是进程?

进程(Process)是资源分配的最小单位,它是操作系统进行资源分配和调度运行的基本单位,通俗理解:一个正在运行的程序就是一个进程。例如:正在运行的qq,微信等他们都是一个进程。

python多进程与多线程

多进程

多进程的作用

图中是一个非常简单的程序,一旦运行hello.py这个程序,按照代码的执行顺序,func_a函数执行完毕后才能执行func_b函数。如果可以让func_a和func_b同时运行,显然执行hello.py这个程序的效率会大大提升。

python多进程与多线程

使用多进程让这两个函数同时执行

python多进程与多线程

多进程代码实现

1. 导入进程包

import multiprocessing

2. 通过进程类创建进程对象

进程对象 = multiprocessing.Process(target=任务名)

python多进程与多线程

3. 启动进程执行任务

进程对象.start()

如下使用单任务执行,需要花费6秒的时间

from time import sleep
import time
start = time.time()
def sing():
    for i in range(3):
        print("唱歌...")
        sleep(1)
def dance():
    for i in range(3):
        print("跳舞...")
        sleep(1)
if __name__ == '__main__':
    sing()
    dance()
    end = time.time()
    print('程序运行时间:',end-start)           
python多进程与多线程

使用多进程,sing和dance两个函数是同时执行的,花费的时间少一半

#1.导包
import multiprocessing
from time import sleep
import time
start = time.time()
def sing():
    for i in range(3):
        print("唱歌...")
        sleep(1)
def dance():
    for i in range(3):
        print("跳舞...")
        sleep(1)
def main():
    #2.通过进程类创建进程对象
    sing_process = multiprocessing.Process(target=sing)
    dance_process = multiprocessing.Process(target=dance)
    #3.启动进程
    sing_process.start()
    dance_process.start()
    
if __name__ == '__main__':
    main()           
python多进程与多线程

获取进程编号

当程序中进程的数量越来越多时,如果没有办法区分主进程和子进程还有不同的子进程,那么就无法进行有效的进程管理,为了方便管理实际上每个进程都是有自己编号的

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

当这个程序运行起来的时候会有个主进程,然后启动了两个子进程,这两个子进程的父进程就是程序的主进程启动的。

#1.导包
import multiprocessing
from time import sleep
import time, os
start = time.time()
def sing():
    print("唱歌进程的pid:",os.getpid(),"父进程pid为:",os.getppid())
    for i in range(3):
        print("唱歌...")
        sleep(1)
def dance():
    print("跳舞进程的pid:",os.getpid(),"父进程pid为:",os.getppid())
    for i in range(3):
        print("跳舞...")
        sleep(1)
def main():
    #2.通过进程类创建2个进程对象
    sing_process = multiprocessing.Process(target=sing)
    dance_process = multiprocessing.Process(target=dance)
    #3.启动进程
    sing_process.start()
    dance_process.start()
    
if __name__ == '__main__':
    print("主进程pid为:",os.getpid())
    main()           
python多进程与多线程

多线程

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

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

多线程的作用

多进程相当于我和多个人聊天需要同时打开多个qq,而多线程则相当于我只打开一个qq但是我在qq里面开启多个窗口

python多进程与多线程

多线程代码实现

代码实现方式和多进程基本一致

1. 导入线程模块

import threading

2. 通过线程类创建线程对象

线程对象 = threading.Thread(target=任务名)

python多进程与多线程

3. 启动线程执行任务

线程对象.start()

多线程实现案例

#1.导包
import threading
from time import sleep
import time
start = time.time()
def sing():
    for i in range(3):
        print("唱歌...")
        sleep(1)
def dance():
    for i in range(3):
        print("跳舞...")
        sleep(1)
def main():
    #2.通过线程类创建线程对象
    sing_process = threading.Thread(target=sing)
    dance_process = threading.Thread(target=dance)
    #3.启动线程
    sing_process.start()
    dance_process.start()
    
if __name__ == '__main__':
    main()           
python多进程与多线程

ps:主线程会等待所有子线程结束后才结束,如果想当主线程关闭的时候,所以子线程也结束,那么可以把设置守护主线程