zoukankan      html  css  js  c++  java
  • python 之 并发编程(开启子进程的两种方式,进程对象的属性)

    第九章并发编程

    同一个程序执行多次是多个进程

    import time
    import os
    ​
    print('爹是:',os.getppid())      #父进程PID,(pycharm)
    print('me是: ',os.getpid())      #3748 14648
    time.sleep(500)

    9.1 开启子进程的两种方式

    服务端目标: 1、不间断地提供服务 2、服务端要支持高并发+高性能

    一个进程在运行过程中开启了子进程(如nginx开启多进程,os.fork,subprocess.Popen等)

    父进程发起请求,操作系统创建子进程

    方式一:

    from multiprocessing import Process
    import time
    import os
    def task(name):
        print('%s is running' %name)
        time.sleep(3)
        print('%s has done' %name)
        print('爹是:', os.getppid()) #me是:  13892
        print('me是: ', os.getpid())  #me是:  7492
    if __name__ == '__main__':                  # windows系统,开启子进程的操作一定要放到这下面
        p=Process(target=task,args=('egon',))     # p=Process(target=task,kwargs={'name':'egon'})
        p.start() # 向操作系统发送请求,操作系统会申请内存空间,然后把父进程的数据拷贝给子进程,作为子进程的初始状态
        print('me是: ', os.getpid())  #me是:  13892
        print('======主')#======主 egon is running egon has done
    • target 表示调用对象,即子进程要执行的任务

    • args 指定为target函数传位置参数,是一个元组形式,必须有逗号

    • kwargs 表示调用对象的字典,kwargs={'name':'egon','age':18}

    • p.start() 启动进程,并调用该子进程中的p.run()

    方式二:

    from multiprocessing import Process
    import time
    ​
    class MyProcess(Process):
        def __init__(self,name):
            super(MyProcess,self).__init__()
            self.name=name
    ​
        def run(self):
            print('%s is running' %self.name)
            time.sleep(3)
            print('%s has done' %self.name)
    ​
    if __name__ == '__main__':
        p=MyProcess('egon')
        p.start()
        print('')  #主  egon is running  egon has done
    • p.run():进程启动时运行的方法,正是它去调用target指定的函数,我们自定义类的类中一定要实现该方法

    9.2 进程之间内存空间隔离

    from multiprocessing import Process
    import time
    x=1000
    def task():
        time.sleep(3)
        global x
        x=0
        print('儿子死啦',x)
    ​
    ​
    if __name__ == '__main__':
        print(x)
        p=Process(target=task)
        p.start()
        time.sleep(5)
        print(x)    #1000    儿子死啦 0    1000

    9.3 父进程等待子进程结束

    from multiprocessing import Process
    import time
    x=1000
    def task():
        time.sleep(3)
        global x
        x=0
        print('儿子死啦',x)
    ​
    if __name__ == '__main__':
        p=Process(target=task)
        p.start()
    ​
        p.join() # 让父亲在原地等
        print(x)
    from multiprocessing import Process
    import time
    x=1000
    def task(n):
        print('%s is runing' %n)
        time.sleep(n)
    ​
    if __name__ == '__main__':
        start_time=time.time()
        p_l=[]
        for i in range(1,4):
            p=Process(target=task,args=(i,))
            p_l.append(p)
            p.start()
    ​
        for p in p_l:                       #1 is runing
            p.join()                        #3 is runing
        print('',(time.time() - start_time)) #2 is runing    主  3.112313

    9.4 进程对象的其他属性

    • p.terminate():强制终止进程p,不会进行任何清理操作,如果p创建了子进程,该子进程就成了僵尸进程,使用该方法需要特别小心这种情况。如果p还保存了一个锁那么也将不会被释放,进而导致死锁

    • p.is_alive():如果p仍然运行,返回True

    • p.join([timeout]):主线程等待p终止(强调:是主线程处于等的状态,而p是处于运行的状态)。timeout是可选的超时时间,强调: p.join只能 join住start开启的进程,而不能join住run开启的进程

    • p.pid:进程的pid

    from multiprocessing import Process
    import time,os
    x=1000
    def task(n):
        print('%s is runing self:%s parent:%s' %(n,os.getpid(),os.getppid()))#self:13032 parent:9136
        time.sleep(3)
    ​
    if __name__ == '__main__':
        p1=Process(target=task,args=(1,),name='任务1')#不指定name,p1.name是process-1
        p1.start()
              
        print(p1.pid)       # 13032 没有p1.ppid
        print(p1.name)      # 任务1
        p1.terminate()      # 向操作系统提交进程终止 
        p1.join()
        print(p1.is_alive()) # False
    print('',os.getpid())# 主 9136
  • 相关阅读:
    hdoj 1002大数加法
    nuxt踩坑
    vue 打包上线后 css3渐变属性丢失的问题解决方案
    linux下crontab不能运行问题
    [转]谈谈数据库的ACID
    web集群时session共享
    redis缓存队列+MySQL +php任务脚本定时批量入库
    Yii2 加载css、js 载静态资源
    PHP实现四种基本排序算法
    phpstorm快捷键
  • 原文地址:https://www.cnblogs.com/mylu/p/11210157.html
Copyright © 2011-2022 走看看