首页 > 代码库 > python 多进程

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常用方法:

  1. is_alive():判断进程实例是否还在执行;
  2. join(【timeout】):是否等待进程实例执行结束,timeout:超时时间
  3. start():启动进程实例(创建子进程)
  4. run():如果没有给定target参数,对这个对象调用start()方法时,将执行对象的run方法
  5. terminate():不管任务(进程)是否结束,立即终止

 

python 多进程