mutiprocessing 模块创建进程,标准库
1, 需要将事件封装为函数
2, 使用mutiprocessing提供的类创建新进程
3, 新的进程和对应的函数相关联,进程启动会自动执行函数,完成事件
4, 进程回收
创建子进程类:
mutiprocessing.Process()
功能: 创建子进程
参数: name: 新进程名,默认名:process-1
target: 目标函数
args: 元祖, 要给函数传递的参数
kwargs: 字典,要给函数传递的参数
p.start() 功能:启动子进程
p.join([timeout]) 功能: 阻塞等待回收响应的子进程; 默认为阻塞;timeout为超时时间
p.name 进程名称
p.pid 创建的进程pid
p.is_alive() true/false 判断进程状态,是否是活跃进程
p.daemon 默认为False, 表示主进程执行后不影响子进程的执行,如果设置为True,则主进程执行完毕,所有的子进程一同推出
1,必须在start()前
2,使用daemon = True的时候,不用加join阻塞
3,该属性不是linux/unix中的守护进程设置
守护进程: 生命周期长,随系统创建、随系统销毁
不受前端控制,后台运行
操作系统进程,或者自动化运行进程居多
import multiprocessing
import time
import os
def eating(sec, food):
print('eathing PID:',os.getpid())
print('我们在吃',food)
time.sleep(sec)
print("{}吃完了".format(food))
def drinking(sec,drinks):
print('drinking PID:',os.getpid())
print('喝{}丫...'.format(drinks))
time.sleep(sec)
print('{}喝完了...'.format(drinks))
#创建子进程,并将函数放到里面执行
#位置传参
p1 = multiprocessing.Process(target = eating, args=(3,'西瓜'))
#字典传参
p2 = multiprocessing.Process(target= drinking,kwargs={'sec':4, 'drinks':'西瓜汁'})
#执行子进程
p1.start()
p2.start()
print('----------------------')
#阻塞子进程
p1.join()
p2.join()
print('==========================')
print('father pid:',os.getpid())
print('father processing')
# 2 个进程复制文件
import os
import multiprocessing
def copy1(f_source, f_target):
size = os.path.getsize(f_source)
n = size // 2
fr = open(f_source, 'rb')
fw = open(f_target, 'wb')
while True:
if n < 64:
data = fr.read(n)
fw.write(data)
break
data = fr.read(64)
fw.write(data)
n -= 64
fw.close()
fr.close()
def copy2(f_source, f_target):
size = os.path.getsize(f_source)
fr = open(f_source,'rb')
fr.seek(size//2,0)
fw = open(f_target,'wb')
while True:
data = fr.read(64)
if not data:
break
fw.write(data)
fw.close()
fr.close()
def main():
pid1 = multiprocessing.Process(target= copy1, args=('/root/meeting.png','/root/copy1.png'))
pid2 = multiprocessing.Process(target= copy2, args=('/root/meeting.png','/root/copy2.png'))
pid1.start()
print(pid1.pid)
pid2.start()
print(pid2.pid)
main()