一.并发和并行
-
多任务:一定时间段内,充分利用cpu资源,同时去执行多个任务
-
并发: 快速交替的 去执行多任务
-
并行: 真正同时的 去执行多任务 ,就是同时进行
二.多进程
1.多进程入门
知识点:
-
进程含义: 运行中的程序
-
进程特点: cpu资源分配的 最小单位
-
多进程模块: multiprocessing
-
进程类: Process
使用步骤:
-
导包 : import multiprocessing
-
创建对象 : 子进程对象 = multiprocessing.Process(target=任务名)
-
开启进程 : 子进程对象.start()
示例:
import multiprocessing
import time
# 任务1
def dance():
for i in range(5):
time.sleep(0.1)
print('跳舞',i)
# 任务2
def sing():
for i in range(5):
time.sleep(0.3)
print('唱歌',i)
# 多进程放到main内
if __name__ == '__main__':
# 1.创建进程对象
p1 = multiprocessing.Process(target=dance)
p2 = multiprocessing.Process(target=sing)
# 2.开启进程
p1.start()
p2.start()
2.os模块获取进程编号
知识点:
获取当前进程id: os.getpid() pid: processing id
获取父进程id: os.getppid() ppid: parent processing id
示例:
import multiprocessing
import os
import time
# 任务1
def dance():
print('dance子进程:', os.getpid(), os.getppid())
for i in range(5):
time.sleep(0.1)
print('跳舞',i)
# 任务2
def sing():
print('sing子进程:', os.getpid(),os.getppid())
for i in range(5):
time.sleep(0.3)
print('唱歌',i)
# 多进程放到main内
if __name__ == '__main__':
print('main主进程:',os.getpid())
# 1.创建进程对象
p1 = multiprocessing.Process(target=dance)
p2 = multiprocessing.Process(target=sing)
# 2.开启进程
p1.start()
p2.start()
3.Process()类的传参,2种方式
知识点:
-
args: 以元组方式传参 注意:如果只有一个参数需要加逗号, 如果多个参数顺序要任务参数顺序一致
-
kwargs: 以字典方式传参 注意:需要{k:v}形式传参,k必须和任务的形参名一致
示例:
import multiprocessing
import os
import time
# 任务1
def dance(num):
print('dance子进程:', os.getpid(), os.getppid())
for i in range(num):
time.sleep(0.1)
print('跳舞',i)
# 任务2
def sing(num):
print('sing子进程:', os.getpid(), os.getppid())
for i in range(num):
time.sleep(0.3)
print('唱歌',i)
# 多进程放到main内
if __name__ == '__main__':
print('main主进程:', os.getpid())
# 1.创建进程对象
p1 = multiprocessing.Process(target=dance,args=(5,))
p2 = multiprocessing.Process(target=sing,kwargs={'num':5})
# 2.开启进程
p1.start()
p2.start()
4.获取当前进程信息
知识点:
-
获取当前进程对象: multiprocessing.current_process()
-
获取当前进程name: multiprocessing.current_process().name
-
获取当前进程pid: multiprocessing.current_process().pid
示例:
import multiprocessing
# 任务1
def dance():
print('dance子进程对象:', multiprocessing.current_process())
print('dance子进程name:', multiprocessing.current_process().name)
print('dance子进程id:', multiprocessing.current_process().pid)
# 任务2
def sing():
print('sing子进程对象:', multiprocessing.current_process())
print('sing子进程name:', multiprocessing.current_process().name)
print('sing子进程id:', multiprocessing.current_process().pid)
# 多进程放到main内
if __name__ == '__main__':
print('main主进程对象:', multiprocessing.current_process())
print('main主进程name:', multiprocessing.current_process().name)
print('main主进程id:', multiprocessing.current_process().pid)
# 1.创建进程对象
p1 = multiprocessing.Process(target=dance,name='danceProcess')
p2 = multiprocessing.Process(target=sing,name='singProcess')
# 2.开启进程
p1.start()
p2.start()
5.注意事项
1. 多进程间不能共享全局变量:
import multiprocessing
mylist = []
# 写
def write():
global mylist
mylist = [1,2,3,4,5]
print('write:',mylist) # [1, 2, 3, 4, 5]
# 读
def read():
global mylist
print('read:',mylist) # [] 说明多个进程间不共享全局变量
# 多进程需要放到main内
if __name__ == '__main__':
# 1.创建进程对象
p1 = multiprocessing.Process(target=write)
p2 = multiprocessing.Process(target=rea