#并发编程
# 处理系统:多道、分时、实时。
#进程:运行中的程序。计算机中可供分配的最小单位。
#三大状态:创建-->就绪 --> 运行-->退出
# 阻塞(运行时遇到input或sleep等时,变成阻塞状态)
# 阻塞状态后一定回到就绪状态等待时间片再次轮转调用。
#os.getpid():得到当前进程
#os.getppid():得到当前进程的父进程
#创建进程
import os
from multiprocessing import Process #Process是一个包,相当于一个模块。
# def func(num): #创建一个函数,作为子进程中调用的方法。
# print('子进程:',os.getpid(),'子进程的父进程:',os.getppid())
# print(num)
#
# if __name__ == '__main__':#当运行进程时,创建了一个子进程,进程与下面要创建的子进程没有关系。在windows系统中,进入子
# #进程最开始时需要引入父进程模块,引入父进程模块会自动执行父进程中的程序,再次创建子进程,为防止这种循环,用
# # if __name__ == '__main__'语句,只在当前进程运行时才创建子进程。(linux系统不会有这种引入父进程模块的情况。)
# print('当前进程:',os.getpid(),'父进程:',os.getppid())
# p = Process(target=func,args = (666,)) #创建一个对象,target接收子进程中的函数名。args关键字接收一个可迭代对象参数。
# #可以是元组形式,只有一个元素时后面必须要加逗号,否则就是元素本身的类型,不是
# #可迭代对象了。
# p.start() #开启一个子进程。异步,操作系统会安排何时执行子进程。
# print('父进程代码结束')#先于子进程执行前执行,顺序执行快于操作系统的安排。
#父进程等待所有子进程结束后再打印结束语(阻塞:join):
# def func(num):
# print(num)
# print(num * '-')
#
# if __name__ == '__main__':
# lis = [] #创建一个空列表,放每一次增加的进程对象。然后循环将每一个对象阻塞。
# #这样就阻止了每一个子进程创建结束后自动往下执行代码。
# for i in range(10):
# p = Process(target=func,args=(i,))
# p.start() #循环创建10个子进程,但是顺序无法控制,遵循异步原理。
# lis.append(p)
# for p_lis in lis:
# p_lis.join()
# print('结束!') #前面循环列表将每一个进程对象阻塞,等到所有都执行结束之后再执行这行代码。
#进程与进程的关系:
#1.父进程与子进程之间没有关系。
#2.父进程与子进程之间的数据是独立的:
# n = 0
# def func():
# global n
# n = 100 #子进程中将n重新赋值:n = 100.但是不改变父进程中的n值。
#
# if __name__ == '__main__':
# p = Process(target=func)
# p.start()
# print(n)
#父进程是等待子进程都执行结束后再回收子进程的资源。
#不能直接获取子程序的返回值。
#利用面向对象创建进程:
# class Myprocess(Process): #一定要继承Process为父类。
# def __init__(self,name): #用来传参
# super().__init__() #用父类中的方法,必须要super()
# self.name = name
# def run(self): #必须是run方法。
# print(os.getpid(),os.getppid())
# print(self.name)
#
# if __name__ == '__main__':
# p = Myprocess('alex')
# p.start()