并发和并行的区别
并发指的是,假如单核的cpu,要同时运行多个任务,这个时候就需要不断的切换任务,只是切换的比较快,没有分辨出来。
并行,是假如是2核的cpu,有两个任务要运行,一个cpu执行一个任务,这个时候两个任务同时运行,就是并行。
可以使用多进程和多线程,完成多任务
一、多进程完成多任务
进程的创建步骤
1、导入进程包
import multiprocessing
2、通过进程类创建进程对象
进程对象 = multiprocessing.Processing(target=任务名)
参数名 说明
target 执行的目标任务名,这里指的是函数名(方法名)
name 进程名,一般不用设置
group 进程组,目前只能使用None
3、启动进程执行任务
进程对象.start()
单进程写法
- import time
- import multiprocessing
-
- 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__':
- sing()
- dance()
多进程写法
- import time
- import multiprocessing
-
-
- 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__':
- sing_process = multiprocessing.Process(target=sing)
- dance_process = multiprocessing.Process(target=dance)
-
- sing_process.start()
- dance_process.start()
-
二、进程执行带有参数的任务
参数名 说明
args 以元组的方式给执行的任务传参
kwargs 以字典的方式给执行任务传参
1、args 参数的使用
sing_process = multiprocessing.Process(target=sing, args=(3,))
sing_process.start()
元组的顺序,要与参数顺序一致
2、kwargs参数的使用
dance_process = multiprocessing.Process(target=dance, kwargs={"num": 3})
dance_process.start()
字典的key 要与参数一致
- import time
- import multiprocessing
-
-
- def sing(num):
- for i in range(num):
- print("唱歌....")
- time.sleep(0.5)
-
-
- def dance(num):
- for i in range(num):
- print("跳舞.....")
- time.sleep(0.5)
-
-
- if __name__ == '__main__':
- sing_process = multiprocessing.Process(target=sing, args=(3,))
- dance_process = multiprocessing.Process(target=dance, kwargs={"num": 4})
-
- sing_process.start()
- dance_process.start()
-
三、获取进程的编号
1、获取当前进程编号
os.getpid()
- import os
-
- pid = os.getpid()
- print(pid)
2、获取当前父进程编号
os.getppid()
- import os
-
- ppid = os.getppid()
- print(ppid)
四、多进程的注意点
1、主进程默认会等待所有的子进程执行结束再结束,保证子进程都结束掉
- import time
- import multiprocessing
-
-
- def work():
- for i in range(10):
- print("工作中")
- time.sleep(0.2)
-
-
- if __name__ == '__main__':
- work_process = multiprocessing.Process(target=work)
- work_process.start()
-
- # 主进程失眠1秒
- time.sleep(1)
- print("主进程执行完成......")
-
-
-
- # 工作中
- # 工作中
- # 工作中
- # 主进程执行完成......
- # 工作中
- # 工作中
- # 工作中
- # 工作中
- # 工作中
- # 工作中
- # 工作中
-
2、子进程设置守护主进程,一旦主进程结束,所有的子进程自动销毁
增加一行代码
work_process.daemon = True
- import time
- import multiprocessing
-
-
- def work():
- for i in range(10):
- print("工作中")
- time.sleep(0.2)
-
-
- if __name__ == '__main__':
- work_process = multiprocessing.Process(target=work)
- work_process.daemon = True
- work_process.start()
-
- # 主进程失眠1秒
- time.sleep(1)
- print("主进程执行完成......")
-
-
- # 工作中
- # 工作中
- # 工作中
- # 工作中
- # 工作中
- # 主进程执行完成......
总结:
为了保证子进程能够正常的运行,主进程会等所有的子进程执行完成以后再销毁,设置守护主进程的目的是主进程退出子进程销毁,不让主进程再等待子进程去执行。
设置守护主进程方式:子进程对象.daemon = True