【Python】多任务和多进程

进程的基本介绍

在我们的操作系统中,每一个程序启动,都会有一个或者多个进程 

进程是资源分配的最小单位,它是操作系统进行资源分配和调度运行的基本单位

你正在运行的谷歌浏览器,QQ,微信等等,都是一个进程,操作系统会根据你的进程来分配CPU,内存等资源

相对于单进程而言,多进程的效率会更高

多进程演示

单进程演示

 

多进程完成多任务

在python中,创建进程十分简单,只需三步

1.导入进程包

2.创建进程对象

3.启动进程

下面是一个多进程完成多任务的一个例子,按照上述步骤就可以 

#导入进程包
import time
import multiprocessing

def coding():
    for i in range(3):
        print('coding...')
        time.sleep(0.2)

def music():
    for i in range(3):
        print('music...')
        time.sleep(0.2)


if __name__ == '__main__':
    
    #创建进程对象
    coding_process = multiprocessing.Process(target=coding)

    music_process = multiprocessing.Process(target=music)

    #启动进程
    coding_process.start()

    music_process.start()

运行结果如下,而且能感觉到运行效率是明显提高运行效率 

创建进程对象

如果函数不需要传入参数:

multiprocessing.Process(targer=函数名) 

如果函数需要传入参数:

multiprocessing.Process(targer=函数名, args = (参数1,参数2,……)

multiprocessing.Process(targer=函数名, kwargs = {参数1 : value1,参数2 : value2,……}

 启动进程

Process.start()

注意:一定要start才能启动进程

带参数的多进程示例:coding函数传入num控制循环的次数,music函数传入t控制睡眠时间 

import time
import multiprocessing

def coding(num):
    for i in range(num):
        print('coding...')
        time.sleep(0.2)


def music(t):
    for i in range(3):
        print('music...')
        time.sleep(t)


if __name__ == '__main__':
    coding_process = multiprocessing.Process(target=coding,args=(3,))
    music_process = multiprocessing.Process(target=music,kwargs={'t':0.2})
    coding_process.start()
    music_process.start()

 

可以自己尝试一下不同参数带来的效果 

进程编号 

当程序中进程数量很多时,为了更好的管理,每一个进程都有自己的编号

PID --- Process ID   子进程ID

PPID --- Parent Process ID    主进程ID

在任务管理器的“详细信息”可以看到进程和编号

获取进程编号 

方法1:

import os

pid = os.getpid()

1

方法2:

import multiprocessing

pid = multiprocessing.current_process().pid

下面是示例, 

import time
import os

pid = os.getpid()
print(pid)
time.sleep(20)

还可以通过os.getppid()获取子进程的主进程的PPID 

import time
import multiprocessing
import os

def coding():
    print('coding....')
    pid = os.getpid()
    print(f'coding的PID:{pid}')

    ppid = os.getppid()
    print(f'coding的PPID:{ppid}')

if __name__ == '__main__':
    print(f'当前主进程pid:{os.getpid()}')
    coidng_process = multiprocessing.Process(target=coding)
    coidng_process.start()

可以看到,上面coding的PPID恰好是这个程序的PID,这就说明了coding_Process正是主进程创建的子进程

杀死进程

os.kill(PID, signal),signal可以是9 、15

9 -- 代表强制杀死进程

15 -- 代表正常杀死进程

很简单就不演示了,只要获取到进程PID就可以结束进程

注意事项

1.进程之间是不共享全局变量的

创建一个子进程,起始就是把主进程的资源复制一份给子进程,两个进程是独立的,创建子进程后,子进程也会拷贝到一个与主进程的全局变量同样名字的变量,但其实两者是完全独立的,只是恰好同名而已

2.主进程不会等待所以子进程结束后再结束

这就有可能出现一种情况:主进程结束了,但子进程还没有结束,还在运行

这显然是不合理的,按常理来说,子进程依赖于主进程中,当主进程结束后,子进程也应该结束

为了防止出现这种问题,有以下两个方案:

方案一:设置守护进程

在创建子进程后,进行相关设置,主进程退出后,不再执行子进程中的代码

process.daemon = True

方案二:销毁子进程

在主进程结束之前,手动销毁子进程

process.terminate()

  • 18
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值