zoukankan      html  css  js  c++  java
  • Python并发编程-进程

      由于GIL(全局解释锁)的问题,多线程并不能充分利用多核处理器,如果是一个CPU计算型的任务,应该使用多进程模块 multiprocessing 。它的工作方式与线程库完全不同,但是两种库的语法和接口却非常相似。multiprocessing给每个进程赋予单独的Python解释器,这样就规避了全局解释锁所带来的问题。

    1.进程创建方式

      方式一、:(开启进程必须放在if __name__ == '__main__':代码块内)

    import time
    import random
    from multiprocessing import Process
    
    def piao(name):
        print('%s piaoing' %name)
        time.sleep(random.randrange(1,5))
        print('%s piao end' %name)
    
    if __name__ == '__main__':  # 进程开启必须放在main()下
        for i in ('aaa', 'bbb', 'ccc'):
            p = Process(name=i, target=piao, args=(i,))
            p.start()
        print('主进程')

      方式二:

    class Piao(Process):
        def __init__(self,name):
            super().__init__()
            self.name = name
    
        def run(self):
            print('%s piaoing' %self.name)
            time.sleep(random.randrange(1,5))
            print('%s piao end' %self.name)
    
    if __name__ == '__main__':  # 进程开启必须放在main()下
        for i in ('aaa', 'bbb', 'ccc'):
            p = Process(name=i, target=piao, args=(i,))
            p.start()
        print('主进程')

    2.进程其他方法示例

      方法介绍:

    p.start():启动进程,并调用该子进程中的p.run() 
    p.run():进程启动时运行的方法,正是它去调用target指定的函数,我们自定义类的类中一定要实现该方法  
    
    p.terminate():强制终止进程p,不会进行任何清理操作,如果p创建了子进程,该子进程就成了僵尸进程,使用该方法需要特别小心这种情况。如果p还保存了一个锁那么也将不会被释放,进而导致死锁
    p.is_alive():如果p仍然运行,返回True
    
    p.join([timeout]):主线程等待p终止(强调:是主线程处于等的状态,而p是处于运行的状态)。timeout是可选的超时时间,需要强调的是,p.join只能join住start开启的进程,而不能join住run开启的进程

      属性介绍:

    p.daemon:默认值为False,如果设为True,代表p为后台运行的守护进程,当p的父进程终止时,p也随之终止,并且设定为True后,p不能创建自己的新进程,必须在p.start()之前设置
    
    p.name:进程的名称
    
    p.pid:进程的pid
    
    p.exitcode:进程在运行时为None、如果为–N,表示被信号N结束(了解即可)
    
    p.authkey:进程的身份验证键,默认是由os.urandom()随机生成的32字符的字符串。这个键的用途是为涉及网络连接的底层进程间通信提供安全性,这类连接只有在具有相同的身份验证键时才能成功(了解即可)

     示例:

    #进程对象的其他方法一:terminate,is_alive
    from multiprocessing import Process
    import time
    import random
    
    class Piao(Process):
        def __init__(self,name):
            self.name=name
            super().__init__()
    
        def run(self):
            print('%s is piaoing' %self.name)
            time.sleep(random.randrange(1,5))
            print('%s is piao end' %self.name)
    
    
    p1=Piao('egon1')
    p1.start()
    
    p1.terminate()#关闭进程,不会立即关闭,所以is_alive立刻查看的结果可能还是存活
    print(p1.is_alive()) #结果为True
    
    print('开始')
    print(p1.is_alive()) #结果为False
    View Code

       注意了:p.join(),是父进程在等p的结束,是父进程阻塞在原地,而p仍然在后台运行

    #进程对象的其他方法二:p.daemon=True,p.join
    from multiprocessing import Process
    import time
    import random
    
    class Piao(Process):
        def __init__(self,name):
            self.name=name
            super().__init__()
        def run(self):
            print('%s is piaoing' %self.name)
            time.sleep(random.randrange(1,3))
            print('%s is piao end' %self.name)
    
    
    p=Piao('egon')
    p.daemon=True #一定要在p.start()前设置,设置p为守护进程,禁止p创建子进程,并且父进程死,p跟着一起死
    p.start()
    p.join(0.0001) #等待p停止,等0.0001秒就不再等了
    print('开始')
    View Code
    #进程对象的其他属性:name,pid
    from multiprocessing import Process
    import time
    import random
    class Piao(Process):
        def __init__(self,name):
            # self.name=name
            # super().__init__() #Process的__init__方法会执行self.name=Piao-1,
            #                    #所以加到这里,会覆盖我们的self.name=name
    
            #为我们开启的进程设置名字的做法
            super().__init__()
            self.name=name
    
        def run(self):
            print('%s is piaoing' %self.name)
            time.sleep(random.randrange(1,3))
            print('%s is piao end' %self.name)
    
    p=Piao('egon')
    p.start()
    print('开始')
    print(p.pid) #查看pid
    View Code

    2.进程池

    3.进程通信

    4.守护进程

    5.进程Queue

  • 相关阅读:
    AMF序列化技巧
    为什么用ByteArray序列化的对象如此小?
    解决Asp.net中翻页问题的自定义用户控件
    新建对象:反射会调用构造函数,clone不会调用构造函数
    Java 的传值小例子
    JDK中设计模式
    tryfinally中的返回值
    c++类中的常量(注意)
    创建有个性的对话框之MFC篇(转)
    用VC在IE浏览器的工具条上添加命令按钮(转 可以借鉴)
  • 原文地址:https://www.cnblogs.com/vipchenwei/p/7221856.html
Copyright © 2011-2022 走看看