1.内容回顾
2.今日内容
3.创建-进程Process
4.join方法
5.进程之间数据隔离
1.内容回顾
# 进程 :是计算机中最小的资源分配单位
# 进程的三状态 :就绪 运行 阻塞
# 并发和并行 :
# 并行 :在一个时刻上,有多个进程在被CPU计算
# 并发 :在一个时间段上,有多个进程在被CPU计算
# 同步异步 :
# 同步 :一件事情与另一件事情有一定的顺序
# 异步 :两件事情可以同时进行
# 阻塞和非阻塞:
# 阻塞 : input sleep recv accept recvfrom
# 非阻塞 :不需要等待就可以直接完成的事情
2.今日内容
# 进程
# 如何去在python代码中 启动一个进程
# 新的模块 :multiprocessing
# 进程模块 :启动进程、基础的进程信息的获取、管理
# 进程的同步
# 进程之间的数据共享
# 进程之间的通信
# 进程池
3.创建-进程Process
import os
import time
from multiprocessing import Process
# print(os.getpid()) #线程id
def func():
time.sleep(1)
print('hello',os.getpid())
if __name__ == '__main__':
for i in range(10):
Process(target=func).start() #开启进程
time.sleep(1)
print('hello2',os.getpid())
# 几个概念 :
# 父进程 :父进程执行的过程中创建了子进程
# 子进程 :
# 主进程 :一般我们直接执行的那个程序就是主进程
# 为什么要有if __name__ == '__main__': windows操作系统开启子进程的方式问题
# 如何开启多个子进程 for while
getppid() #显示父进程
def func():
time.sleep(1)
print('hello',os.getpid(),os.getppid())
if __name__ == '__main__':
for i in range(3):
p = Process(target=func)
p.start()
time.sleep(1)
print('hello2',os.getpid())
# 如何给子进程传参数 ?
import time
from multiprocessing import Process
def func(num,name):
print(num,'hello',name)
if __name__ == '__main__':
for i in range(10):
p = Process(target=func,args=(i,'yuan',)) #(,)不能一个元素
p.start() #非阻塞
print('主进程')
# 子进程可以有返回值么?
# 不能有返回值
# 因为子进程函数中的返回值无法传递给父进程,因为内存隔离的问题
4.join方法
# 主进程会默认等待子进程结束之后才结束
# 父进程要负责回收子进程占用的操作系统资源
import time
from multiprocessing import Process
def wahaha():
time.sleep(3)
print('in wahaha')
if __name__ == '__main__':
Process(target=wahaha()).start()
print('主进程')
import time
from multiprocessing import Process
def send_mail(n):
time.sleep(0.5)
print('发送邮件%s'%n)
if __name__ == '__main__':
l = []
for i in range(10):
p = Process(target=send_mail,args=(i,))
l.append(p)
p.start()
for p in l:
p.join() #阻塞到所有子进程执行完
print('所有的邮件都已经发出')
5.进程之间数据隔离
from multiprocessing import Process
n = 100
def func():
global n
n = n - 1
if __name__ == '__main__':
p_lst = []
for i in range(100):
p = Process(target=func)
p.start()
p_lst.append(p)
for p in p_lst:
p.join()
print(n)