进程理论+创建进程的两种方法+进程join方法+进程间数据相互隔离

"""
进程理论
程序:一堆死代码
进程:正在运行的程序
进程是资源单位,进程与进程之间数据是绝对意义上的物理隔离,但是可以利用某些技术实现数据交互(消息队列)

并行:同时运行
并发:看起来像同时运行


同步与异步:描述的是任务的提交方式
同步:提交任务之后原地等待任务的返回结果
异步:提交任务之后 继续执行的后续代码 不等待结果 (回调机制)


阻塞与非阻塞:描述的是程序的运行状态
阻塞:程序阻塞态
非阻塞:就绪态或者运行态
程序运行,会有三种状态:分别是 运行态,就绪态,阻塞态
程序正在运行就是运行态,一旦遇到IO操作,例如需要等待输入指令,程序也就停止运行卡住了,也就是进入到了
阻塞状态.进入阻塞状态之后,一旦输入完成或者读取数据的IO操作完成,程序就从阻塞态转化成就绪态,等待CPU来执行
这个程序,一旦CPU过来继续执行这段数据,那么这个程序就从就绪态转换成运行态
程序从阻塞态转化成运行态必须先转换成就绪态,然后再转换成运行态
就绪态和运行态统称为非阻塞状态

"""


创建进程的两种方法:
"""
创建进程
1.双击
2.代码创建

进程是资源单位,进程之间数据隔离
同一份程序也可以有多个进程
"""


# 创建进程的第一种方式

from multiprocessing import Process
import time

def task(name): ###随便创建一个函数,执行一个功能,也就是一个任务,这个任务可以自己随便定义
print('%s is running' % name)
time.sleep(3)
print('%s is end' % name)

if __name__ == '__main__':
p = Process(target=task,args=('jason',)) # 函数名加括号优先级最高
####注意这里面的args后面必须是一个元组的形式,而只有一个元素的元组,后面必须加逗号,不加逗号会报错,会被当成字符串
p.start() # 告诉操作系统帮你创建一个进程:1.申请内存空间 2.执行当前文件中的代码
# 将产生的名字全部丢到新申请的名称空间中

# p.join() ###如果加一句这个join 那么这个主进程就会在这里等待这个字进程结束之后,再往下继续执行
###也就是原来在这个主进程中,创建一个子进程,是不需要等待子进程去执行完才继续往下执行
###现在加了一个join 之后,主进程就需要在这里等待子进程运行结束,才能回来继续往下执行代码
###也就是从异步执行变成了同步执行
print('主')

# windows操作中创建的方式 会将以模块导入的方式从头到尾执行当前文件
# linux中 是直接当前文件的代码拷贝一份(fork)



###补充:装饰器的模板
def outter(a):
def wrapper(func):
def inner(*args,**kwargs):
return func(*args,**kwargs)
return inner
return wrapper

@outter('jason') # @wrapper
def login():
...
pass ###注意,以后写伪代码,占位,既可以写pass 也可以写三个点 ... 省略号




print('=====================================================')
# 创建进程的第二种方式
from multiprocessing import Process
import time

class MyProcess(Process):
###创建一个自定义的类,继承原来的Process类
def __init__(self,name):
super().__init__()
self.name = name

def run(self): # 第二种方式里面的run就类似于第一种方式里面的task
print('%s is running' % self.name)
time.sleep(1)
print('%s is end' % self.name)


if __name__ == '__main__':
p = MyProcess('jason')
p.start()
print('主')






进程join 方法
from multiprocessing import Process
import time


def test(name):
print('%s is running ' % name)
time.sleep(2)
print("%s had end " % name)

if __name__ == '__main__':
p_list = []
for i in range(4):
p = Process(target=test,args=('szp %s' % i,))
p_list.append(p)

for p in p_list:
p.start()###这个start 仅仅只是告诉你需要开启一个这样的进程
# p.join()
##加了这个join 之后,就会变成串行执行了,一个一个的开启,等待上一个结束之后,再开启下一个进程




进程间数据相互隔离


"""
进程之间数据相互隔离:
在windows系统中,创建一个子进程,会将原来的代码全部拷贝一份,重新分配一块资源,
重新创建名称空间,
所以,在这里创建子进程的话,必须放置在 if __name__ == "main":下面,否则会无限的递归创建子进程,不断的拷贝,
一直到超过最大深度,报错

"""

from multiprocessing import Process


money = 10000000000000

def task():
global money
money = 0
print('我真的运行了 没骗你')

if __name__ == '__main__':
p = Process(target=task)
p.start()###这里仅仅是告诉操作系统需要开启一个这样的进程,
p.join() ##原地等待,变成同步执行
print(money)








猜你喜欢

转载自www.cnblogs.com/1832921tongjieducn/p/11312562.html