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
  • 相关阅读:
    PAT 1006 Sign In and Sign Out
    PAT 1004. Counting Leaves
    JavaEE开发环境安装
    NoSql数据库探讨
    maven的配置
    VMWARE 下使用 32位 Ubuntu Linux ,不能给它分配超过3.5G 内存?
    XCODE 4.3 WITH NO GCC?
    在苹果虚拟机上跑 ROR —— Ruby on Rails On Vmware OSX 10.7.3
    推荐一首让人疯狂的好歌《Pumped Up Kicks》。好吧,顺便测下博客园可以写点无关技术的帖子吗?
    RUBY元编程学习之”编写你的第一种领域专属语言“
  • 原文地址:https://www.cnblogs.com/mylu/p/11210157.html
Copyright © 2011-2022 走看看