python多进程操作实例
由于CPython实现中的GIL的限制,python中的多线程其实并不是真正的多线程,如果想要充分地使用多核CPU的资源,在python中大部分情况我们需要使用多进程。这也许就是python中多进程类库如此简洁好用的原因所在。在python中可以向多线程一样简单地使用多进程。
一、多进程
process的成员变量和方法:
>>classmultiprocessing.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子进程。
实例:
importmultiprocessing importtime importsys
defworker(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()
defdaemon(): 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() defnon_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("thenumberofCPUis"+str(multiprocessing.cpu_count())) print("Allchildrenprocesses:") forpinmultiprocessing.active_children(): print("child:"+p.name+":"+str(p.pid)) print() w.join() #d.join()