python 多进程管理(Python中的多进程是什么)
多进程 multiprocessing
由于Python是跨平台的 ,自然也应该提供一个跨平台的多进程支持 。multiprocessing模块就是跨平台版本的多进程模块 。
multiprocessing模块提供了一个Process类来代表一个进程对象。
Unix/Linux操作系统提供了一个fork()系统调用 ,它非常特殊 。普通的函数调用,调用一次 ,返回一次 ,但是fork()调用一次 ,返回两次 ,因为操作系统自动把当前进程(称为父进程)复制了一份(称为子进程) ,然后 ,分别在父进程和子进程内返回 。
子进程永远返回0 ,而父进程返回子进程的ID 。这样做的理由是 ,一个父进程可以fork出很多子进程 ,所以,父进程要记下每个子进程的ID ,而子进程只需要调用getppid()就可以拿到父进程的ID 。
Python的os模块封装了常见的系统调用 ,其中就包括fork,可以在Python程序中轻松创建子进程:
importos print(Process(%s)start...%os.getpid()) #OnlyworksonUnix/Linux/Mac: pid=os.fork() ifpid==0: print(Iamchildprocess(%s)andmyparentis%s.%(os.getpid(),os.getppid())) else: print(I(%s)justcreatedachildprocess(%s).%(os.getpid(),pid))运行结果如下:
Process(69673)start... I(69673)justcreatedachildProcess(69674) Iamchildproces(69674)andmyparentis69673.有了fork调用 ,一个进程在接到新任务时就可以复制出一个子进程来处理新任务 ,常见的Apache服务器就是由父进程监听端口,每当有新的http请求时 ,就fork出子进程来处理新的http请求 。
但是这个fork在windows操作系统是没有的 。于是出现了处理fork的通用模块 ,以保证在不同操作系统间的调用 。
multiprocessing模块就是跨平台版本的多进程模块 。
multiprocessing模块提供了一个Process类来代表一个进程对象 ,下面的例子演示了启动一个子进程并等待其结束:
#!/usr/bin/envpython #coding=utf-8 frommultiprocessingimportProcess importos """ 子进程要执行的代码 """ defrun_proc(name): print(Runchildprocess%s(%s)%(name,os.getpid())) if__name__==__main__: print(Parentprocess%s.%os.getpid()) p=Process(target=run_proc,args=(test_code,)) print(Childprocesswillstart.) p.start() p.join() print(Childprocessend.)执行结果如下:
$pythonforkbymutilprocessing.py Parentprocess70227. Childprocesswillstart. Runchildprocesstest_code(70228) Childprocessend.创建子进程时 ,只需要传入一个执行函数和函数的参数 ,创建一个Process实例 ,用start()方法启动 ,这样创建进程比fork()还要简单 。
创心域SEO版权声明:以上内容作者已申请原创保护,未经允许不得转载,侵权必究!授权事宜、对本内容有异议或投诉,敬请联系网站管理员,我们将尽快回复您,谢谢合作!