• 进程


    进程:

      什么是进程

        进程指的是一个程序的运行过程,或者说一个正在执行的程序
    所以说进程一种虚拟的概念,该虚拟概念起源操作系统
    串行: 一个任务完完整整运行完毕才能执行下一个任务
    并发: 多个任务看起来是同时运行的,单核下就能实现并发(并发=切换+保存状态)
    并行: 多个任务是真正意义上的同时运行,只有多核才能实行并行

    开启子进程的俩种方式
    from multiprocessing import Process
    import time
    
    def task(name):
        print('%s is running' %name)
        time.sleep(3)
        print('%s is done' %name)
    
    # 在windows系统上,开启子进程的操作必须放到if __name__ == '__main__'的子代码中
    if __name__ == '__main__':
        p=Process(target=task,args=('egon',))     
        #或者这样写Process(target=task,kwargs={'name':'egon'})
        p.start() # 只是向操作系统发送了一个开启子进程的信号
        print('')
    
    结果:
    主
    egon is running
    egon is done
    第一种
    from multiprocessing import Process
    import time
    
    class Myprocess(Process):
        def __init__(self,name):
            super().__init__()
            self.name=name
    
        def run(self):
            print('%s is running' %self.name)
            time.sleep(3)
            print('%s is done' %self.name)
    
    # 在windows系统上,开启子进程的操作必须放到if __name__ == '__main__'的子代码中
    if __name__ == '__main__':
        p=Myprocess('egon')
        p.start() # 只是向操作系统发送了一个开启子进程的信号
        print('')
    
    结果:
    主
    egon is running
    egon is done
    第二种
    join:让主进程在原地等待,等待子进程运行完毕,不会影响子进程的执行
    from multiprocessing import Process
    import time
    
    def task(name,n):
        print('%s is running' %name)
        time.sleep(n)
        print('%s is done' %name)
    
    if __name__ == '__main__':
        p1=Process(target=task,args=('子1',1))
        p2=Process(target=task,args=('子2',2))
        p3=Process(target=task,args=('子3',3))
    #第一种
        start=time.time()
        p1.start()
        p2.start()
        p3.start()
        time.sleep(5)
    
        p3.join() #3
        p1.join()
        p2.join()
        print('',(time.time()-start))
    #第二种
        start=time.time()
        p_l=[]
        for i in range(1,4):
            p = Process(target=task, args=('子%s' %i, i))
            p_l.append(p)
            p.start()
    
        for p in p_l:
            p.join()
        print('', (time.time() - start))
    结果:
    子2 is running
    子1 is running
    子3 is running
    子1 is done
    子2 is done
    子3 is done
    主 5.143582582473755
    举例

    进程之间内存空间相互隔离

    from multiprocessing import Process
    n=100
    def task():
        global n
        n=0
    #子进程
    # if __name__ == '__main__':
    #     p=Process(target=task)
    #     p.start()
    #     p.join()
    #     print(n)
    结果:100
    
    #主进程
    task()
    print(n)
    结果:0
    举例
    进程pid:每一个进程在操作系统内都有一个唯一的id号,称之为pid
    from multiprocessing import Process,current_process
    import time
    
    def task():
        print('%s is running' %current_process().pid)
        time.sleep(10)
        print('%s is done' %current_process().pid)
    
    if __name__ == '__main__':
        p=Process(target=task)
        p.start()
        print('',current_process().pid)
    #可以在cmd中使用tasklist |findstr 进程号 看到
    结果:
    主 11956
    11660 is running
    11660 is done
    进程pid
    进程对象其他相关的属性或方法
    from multiprocessing import Process
    import time,os
    
    def task():
        print('%s is running 爹是:%s' %(os.getpid(),os.getppid()))
        time.sleep(5)
        print('%s is done 爹是:%s' %(os.getpid(),os.getppid()))
    
    
    if __name__ == '__main__':
        p=Process(target=task)
        p.start()
        print('主:%s 主他爹:%s' %(os.getpid(),os.getppid()))
    结果:
    主:11508 主他爹:4920
    9928 is running 爹是:11508
    9928 is done 爹是:11508
    getppid
    from multiprocessing import Process,current_process
    import time,os
    
    def task():
        print('%s is running 爹是:%s' %(os.getpid(),os.getppid()))
        time.sleep(10)
        print('%s is done 爹是:%s' %(os.getpid(),os.getppid()))
    
    if __name__ == '__main__':
        p=Process(target=task,name='子进程1')
        p.start()
        print(p.name)
        p.terminate()  #杀死子进程
        time.sleep(0.1)
        print(p.is_alive())  #判断是否还在运行
        print('主:%s 主他爹:%s' %(os.getpid(),os.getppid()))
    结果:
    子进程1
    False
    主:10948 主他爹:4920
    terminate和is_alive
  • 相关阅读:
    Binary Tree Zigzag Level Order Traversal
    Binary Tree Level Order Traversal
    Symmetric Tree
    Best Time to Buy and Sell Stock II
    Best Time to Buy and Sell Stock
    Triangle
    Populating Next Right Pointers in Each Node II
    Pascal's Triangle II
    Pascal's Triangle
    Populating Next Right Pointers in Each Node
  • 原文地址:https://www.cnblogs.com/zhouhao123/p/11247968.html
Copyright © 2020-2023  润新知