• python类库32[多进程]



    由于CPython实现中的GIL的限制,python中的多线程其实并不是真正的多线程,如果想要充分地使用多核CPU的资源,在python中大部分情况我们需要使用多进程。 这也许就是python中多进程类库如此简洁好用的原因所在。在python中可以向多线程一样简单地使用多进程。

    一 多进程 

    process的成员变量和方法:

    >>class multiprocessing.Process([group[, target[, name[, args[, kwargs]]]]]) 来的定义类似于threading.Thread。target表示此进程运行的函数,args和kwargs表示target的参数。

    >>name, pid

    分别表示进程的名字,进程id。 

    >> daemon成员

    daemon标志位bool变量,需要在start()调用前设置。daemon的初始值是从父进程继承而来。当一个进程结束的时候,它尝试去结束它的所有的daemon子进程。

    注意: 

    daemon进程不允许创建子进程。否则当daemon进程结束的时候它的子进程不能被结束。

    这里的daemon不是Unix的daemon进程,当父进程结束的时候所有的daemon子进程也将被终止(对于非daemon进程,父进程不等待非daemon的紫子进程,除非显示地对非daemon子进程使用join()方法)。

    >>  exitcode

    如果进程还没有退出,则为None,如果正确的退出则为0,如果有错误则为>0的错误代码,如果进程为终止则为-1*singal。  

    >> start(), is_live(), terminate()

    start()用来启动进程,is_live()用来查看进程的状态,terminate()用来终止进程。

    >> run()

    可以在process的子类中重载run()方法,从而设定进程的任务。重载process是构造新进程的另一种方式,一定程度上上等价于process的target参数。

    multiprcessing的静态方法:

    >>  multiprocessing.cpu_count()

    用来获得当前的CPU的核数,可以用来设置接下来子进程的个数。 

    >>  multiprocessing.active_children()

    用来获得当前所有的子进程,包括daemon和非daemon子进程。 

    实例:

    import multiprocessing
    import time
    import sys

    def worker(num):
        p = multiprocessing.current_process()
        print ('Starting:' + p.name + ":" + str(p.pid))
        print(str(num))
        sys.stdout.flush()
        print ('Exiting :' + p.name + ":" + str(p.pid))
        sys.stdout.flush()

    def daemon():
        p = multiprocessing.current_process()
        print ('Starting:' + p.name + ":" + str(p.pid))
        sys.stdout.flush()
        time.sleep(10)
        print ('Exiting :' + p.name + ":" + str(p.pid))
        sys.stdout.flush()
        
    def non_daemon():
        p = multiprocessing.current_process()
        print ('Starting:' + p.name + ":" + str(p.pid))
        sys.stdout.flush()
        time.sleep(20)
        print ('Exiting :' + p.name + ":" + str(p.pid))
        sys.stdout.flush()
        
    if __name__ == '__main__':
        w = multiprocessing.Process(name='worker', target=worker, args=(100,))
        d = multiprocessing.Process(name='daemon', target=daemon)
        d.daemon = True
        nd = multiprocessing.Process(name='non-daemon', target=non_daemon)
        w.start()
        d.start()
        nd.start()
        
        print("the number of CPU is " + str(multiprocessing.cpu_count()))
        print("All children processes:")
        for p in multiprocessing.active_children():
            print("child:" + p.name + ":" + str(p.pid))
        print()
        
        w.join()
        #d.join()


    运行结果:

     

    可以从上面的例子看到没有多非daemon子进程使用join()方法,结果父进程没有等待非daemon进程结束就退出了。 

    完! 

  • 相关阅读:
    Android系统进程Zygote启动过程的源代码分析
    Android系统默认Home应用程序(Launcher)的启动过程源代码分析
    Android应用程序安装过程源代码分析
    Android应用程序进程启动过程的源代码分析
    Android应用程序绑定服务(bindService)的过程源代码分析
    Android应用程序发送广播(sendBroadcast)的过程分析
    Android应用程序注册广播接收器(registerReceiver)的过程分析
    Android系统中的广播(Broadcast)机制简要介绍和学习计划
    文章转载至CSDN社区罗升阳的安卓之旅,原文地址:
    解开Android应用程序组件Activity的"singleTask"之谜
  • 原文地址:https://www.cnblogs.com/itech/p/2314680.html
Copyright © 2020-2023  润新知