python 多进程
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python 多进程相关的知识,希望对你有一定的参考价值。
1. 进程 VS 程序
编写完毕的代码,在没有运行的时候,称之为程序
正在运行着的代码,就成为进程
进程,除了包含代码以外,还有需要运行的环境等,所以和程序是有区别的
FORK
#coding=utf-8 import os import time num = 0 # 注意,fork函数,只在Unix/Linux/Mac上运行,windows不可以 pid = os.fork() #相当于创建了2个进程
if pid == 0: num+=1 print(‘哈哈1---num=%d‘%num) else: time.sleep(1) num+=1 print(‘哈哈2---num=%d‘%num)
运行结果:
总结:
- 多进程中,每个进程中所有数据(包括全局变量)都各有拥有一份,互不影响
- 只能在linux/unix 里执行,windows里没有fork
- fork 会在执行的时候生产一个PID 为0 的子进程。
结果
多次fork问题
如果在一个程序,有2次的fork函数调用,是否就会有3个进程呢?
#coding=utf-8 import os import time # 注意,fork函数,只在Unix/Linux/Mac上运行,windows不可以 pid = os.fork() if pid == 0: print(‘哈哈1‘) else: print(‘哈哈2‘) pid = os.fork() if pid == 0: print(‘哈哈3‘) else: print(‘哈哈4‘) time.sleep(1)
运行结果:
所以 上面的if else 分成两个进程,两个进程结束后又各自分出2个进程 一共四个进程。
父子进程的执行顺序
父进程、子进程执行顺序没有规律,完全取决于操作系统的调度算法
#下面是fork炸弹,不信你可以一下。。 while Ture: os.fork
multiprocessing
如果你打算编写多进程的服务程序,Unix/Linux无疑是正确的选择。由于Windows没有fork调用,难道在Windows上无法用Python编写多进程的程序?
由于Python是跨平台的,自然也应该提供一个跨平台的多进程支持。multiprocessing模块就是跨平台版本的多进程模块。
multiprocessing模块提供了一个Process类来代表一个进程对象,下面的例子演示了启动一个子进程并等待其结束:
from multiprocessing import Process # 子进程要执行的代码 def test(name): print(‘子进程运行中,name= %s ,pid=%d...ppid=%d‘ % (name, os.getpid(),os.getppid())) if __name__==‘__main__‘: print(‘父进程 %d.‘ % os.getpid()) p = Process(target=test, args=(‘test‘,)) print(‘子进程将要执行‘) p.start()#让这个进程开始执行test函数里的代码 p.join()# 等待子进程结束 print(‘子进程已结束‘)
运行结果:
Process
- target:表示这个进程实例所调用对象
- args:表示调用对象的参数元组
- name:为当前进程实例的别名
Process常用方法:
- is_alive():判断进程实例是否还在执行;
- join(【timeout】):是否等待进程实例执行结束,timeout:超时时间
- start():启动进程实例(创建子进程)
- run():如果没有给定target参数,对这个对象调用start()方法时,将执行对象的run方法
- terminate():不管任务(进程)是否结束,立即终止
以上是关于python 多进程的主要内容,如果未能解决你的问题,请参考以下文章