linux系统中提供了fork函数进行进程的创建,这个接口在函数返回上比较特殊,有两个返回值,一个是子进程返回值为0,一个是父进程返回值,值大于0,表是子进程的ID.如果小于0.则表示接口出错.
python做为一个跨平台的语言,在os包中也提供了fork接口,并且沿袭了linux系统中fork接口的传统,接口有两个返回值,含义和linux系统中相似.具体使用如下:
注意事项:多进程在win系统中可能会报错,因为win系统中没有fork接口,所以在学习python的时候还是推荐使用linux或者mac系统,mac系统为上选.
一、使用os.fork
#!/usr/bin/python #coding:utf-8 import os print "proess id is %d" % os.getpid() p = os.fork() if(p==0): print "this is a child process" elif p>0: print "this is a pp proccess %d" % p
运行结果:
proess id is 27048
this is a pp proccess 27053
this is a child process
二、使用process
Process在multiproccessing包中,功能是创建进程,包含的方法主要有:is_alive()、join([timeout])、run()、start()、terminate()。其中,Process以start()启动某个进程
#!/usr/bin/python #coding:utf-8 import os from multiprocessing import Process def domyprocess(msg): print 'process id is %d ' % os.getpid() return if __name__ == '__main__': print 'paraent proccess id %s' % os.getpid() t1 = Process(target=domyprocess,args=('hello',)) t1.start() t1.join() t2 = Process(target=domyprocess,args=('world',)) t2.start() t2.join()
运行结果:
paraent proccess id 27616
process id is 27621
process id is 27622
三、进程池pool
pool提供了可以创建多个进程的功能,默认情况下,pool创建的进程数和计算机的CPU核数相等.正式因为这个原因,也是我们的例子里面为什么没有5个进程同时运行,而是先运行了4个,有一个结束后,才启动了第5个进程.
如果想要指定进程数,可以在使用的时候指定进程池中的进程数.如:pool(10)
#!/usr/bin/python #coding:utf-8 import os, time, random from multiprocessing import Pool def domyprocess(msg): print '%s process id is %d ' % (msg,os.getpid()) begin = time.time() time.sleep(random.random()*3) end = time.time() print '%d run %d seconds' % (os.getpid(),end-begin) return if __name__ == '__main__': print 'paraent proccess id %s' % os.getpid() p=Pool(); for i in range(5): p.apply_async(domyprocess,args=(1,)) print 'wait process to do....' p.close() p.join() print 'process are run end....'
运行结果:
paraent proccess id 28191
wait process to do....
1 process id is 28197
1 process id is 28199
1 process id is 28198
1 process id is 28200
28197 run 0 seconds
1 process id is 28197
28200 run 1 seconds
28198 run 2 seconds
28199 run 2 seconds
28197 run 1 seconds
process are run end....
学习永无止境,我将继续前行