1.多进程
fork()函数调用一次返回两次,分别在父进程和子进程内返回,子进程永远返回0,父进程返回子进程的ID,子进程只需要调用getppid()可以拿到父进程的ID。
在python中创子进程:
import os
print('process (%s) start...' % os.getpid())
pid =os.fork()
if pid==0:
print('i am child process (%s) and my parent is (%s).'%(os.getpid(),os.getppid()))
else:
print('i (%s) just created a child process (%s).'%(os.getpid(),pid))
结果:
process (78413) start...
i (78413) just created a child process (78996).
i am child process (78996) and my parent is (78413).
2.使用multiprocessing
启动一个子进程并等待其结束:
from multiprocessing import Process
import os
def run_proc(name):
print("运行子进程 %s (%s)"%(name,os.getpid))
if __name__ == '__main__':
print('父进程是 %s.'%os.getpid())
p = Process(target=run_proc, args=('test',))
#p=process(target=run_proc,args=('test',))
print('子进程将开始')
p.start()
p.join()
print('子进程结束')
结果:
运行子进程 test ()
子进程结束
3.`进程池`
如果要启动大量的子进程,可以使用进程池的方式批量创建子进程
代码
```python
from multiprocessing import Pool
import os,time,random
def long_time_task(name):
print('运行测试 %s (%s)' %(name,os.getpid()))
start = time.time
time.sleep(random.random()*3)
end = time.time
print('测试%s 运行 %0.2f seconds'%(name,(end - start)))
if __name__=='__main__':
print('父进程是%s'%os.getpid())
p=Pool(4)
for i in range(5):
p.apply_async(long_time_task,args=(i,))
print('等待')
p.close()
p.join()
print('完成')
结果:
父进程是84957
等待
运行测试 0 (84960)
运行测试 1 (84959)
运行测试 2 (84961)
运行测试 3 (84962)
运行测试 4 (84962)
完成