• 进程理论+创建进程的两种方法+进程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)








  • 相关阅读:
    Java集合类的操作笔记
    Java一维数组转换二叉树结构
    Python学习记录(一)
    Android测试读写sd卡文件与写sd卡文件耗时
    如何高效地分析Android_log中的问题?——查看Android源码
    Java替换字符串中的占位符
    Android 编译错误——布局 Error parsing XML: not well-formed (invalid token)
    Android Studio工程引用第三方so文件
    设计模式——设计模式之禅的阅读笔记
    Android Studio的快捷键
  • 原文地址:https://www.cnblogs.com/1832921tongjieducn/p/11312562.html
Copyright © 2020-2023  润新知