zoukankan      html  css  js  c++  java
  • 进程及Python实现

    进程杂谈

    #进程就是正在执行的一个过程,是对正在运行程序的一个抽象
    
    #进程由程序、数据集和进程控制块(最重要的,进程切换  状态如何保存,恢复和记录)组成
    
    """
    进程调度:
        1.先来先服务
        2.短作业优先调度
        3.时间片轮转法
        4.多级反馈队列
    
    进程遇到IO就会被挂起
    """
    
    '''
    将一个单独的cpu变成多个
    虚拟的cpu(多道技术:时间多路复用和空间
    多路复用+硬件上支持隔离)
    没有进程的抽象,现代计算机将不复存在
    '''
    
    '''
    操作系统的作用:
        1.隐藏丑陋复杂的硬件接口,提供良好的抽象接口
        2.管理,调度进程,并且将多个进程对硬件的竞争变得有序
    '''
    
    '''
    多道技术:
        1.产生背景:针对单核,实现并发
        ps:现在的主机一般是多核,那么每个核都会利用多道技术
        空间复用
        时间复用
    '''
    
    '''
    同步和异步是通讯方式,阻塞和非阻塞是等待状态
    同步 阻塞:发出消息,不回就傻等。跟女神聊天,站在一旁等,什么都不干
    同步 非阻塞:发消息,不回就等,但是干别的事情。跟女神聊天,站在一旁等,一边吃饭一边回头看看手机等消息
    异步 非阻塞:发消息,不回消息也不等,就去干别的。跟女神聊天,不回我就去外面打篮球,等听到电话响了就去聊天
    异步 阻塞:发消息,不回也不等,但是也不干别的。跟女神聊天,不回我就在屋里想其他美女,啥也不干。
    
    '''
    
    """
    串行
    并发    切换+保存状态
    并行
    
    CPU切换
    
    开启子进程的原因是为了支持并发
    
    #这是一个函数,也相当于一个作业,
    执行时开启一个子进程,会把父进程整个放到新的名称空间里面执行
    ,所以x=1也会放进去
    
    
    
    x = 1
    def task(): 
        print(x)
        
        
    主进程会等子进程全部运行结束才会结束
    
    
    
    #僵尸进程:父进程的子进程结束的时候父进程没有wait()情况下子进程会变成僵尸进程,即子进程先结束,父进程未回收子进程,没有释放子进程占用的资源
    
    #孤儿进程:一个父进程退出,它的一个或多个子进程还在运行,那么这些子进程将成为孤儿进程。孤儿进程将会被init进程(进程号为1)所收养,并由init进程对它们完成状态收集工作(是无害的)
    
    #父进程等着子进程都死,回收僵尸进程,也是无害的
    
    #父进程一直不死,造成了大量僵尸进程,占用了大量的pid号,是有害的,因为pid号是有限的,最简单的解决办法就是杀死父进程
    
    

    python实现开启进程

    # multiprocess模块:其实是一个操作管理进程的包,
    # 包括创建进程部分,进程同步部分,进程池部分,
    # 进程之间的数据共享
    
    
    #下面的代码会报错,因为子进程会把父进程的代码拷贝运行,再生成子进程在拷贝,,,,类似递归
    
    from multiprocessing import Process
    import time
    
    def task():
        print('进程 start')
        time.sleep(2)
        print('进程 end')
    
    p = Process(target=task)#实例化出来对象,向操作系统发送开启子进程的请求,还没开启子进程。
    p.start()#告诉操作系统我要开启子进程
    
    
    
    #01 开启子进程的方式一(调用模块改进执行方法,加__name__ = __main__)
    
    
    from multiprocessing import Process
    import time
    
    def Study(name, age):
        print(f'{name}启动了子进程1')
        print(f'{name}的年龄是{age}')
    
    def Play(name,age):
        print(f'{name}启动了子进程2')
        print(f'{name}的年龄是{age}')
    
    if __name__ == '__main__':
        p = Process(target=Study, args=('nick', 18))
        p2 = Process(target=Play, args=('tank', 49))
        p.start() #只是发送请求开启子进程,
        # time.sleep(2)
        p2.start()#只是发送请求开启子进程,
        print('执行了父进程') #按顺序执行下来,比上面两个start要先执行
    
    #开启子进程的方式二(写一个类继承Process类)
    from multiprocessing import Process
    
    class Study(Process):
        def __init__(self, name):
            super().__init__()  #写完这个,下面的name又变成了Test-2
            self.name = name
            print(name)
        def run1(self, v):
            self.v = v
            print(f'{self.name}的跑步速度是{v}')
    
    if __name__ == '__main__':
        p = Study('nick')
        p.start()
        p.run1(29)
        
    #3 验证进程的内存空间隔离
    from multiprocessing import Process
    import time
    
    x = 0
    def task():
        global x
        x = 100
        print(f'子进程的x修改为了{x}')
    if __name__ == '__main__':
        p = Process(target=task)
        p.start()
        time.sleep(3)
        print(x) #先打印100,再打印0
    
    
  • 相关阅读:
    《骆驼祥子》
    《基督山伯爵》
    JDeveloper 假死问题
    JSP代码执行顺序
    Ajax简单案例(实现提交值到服务器值不刷新页面)
    JS和JSP之间值传递
    如何更好的编码
    Telnet 便捷执行脚本
    MyBatis 缓存
    MyBatis 中传递多个参数的 4 种方式
  • 原文地址:https://www.cnblogs.com/michealjy/p/11517005.html
Copyright © 2011-2022 走看看