pyrhon多进程操作初探

时间:2024-09-08 13:03:38

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....

学习永无止境,我将继续前行