1 多任务fork Unix/Linux/Mac

# 注意,fork函数,只在Unix/Linux/Mac上运行,windows不可以

1.如下程序,来模拟“唱歌跳舞”这件事情

#-*- coding:utf-8 -*- 

import time

def sing():
    """唱歌3次,每次休息1s"""
    for i in range(3):
        print("he is singing..%s."%i)
        time.sleep(1)

def dance():
    """跳舞3次每次修养1s"""
    for i in range(3):
        print("he is dancing...%s"%i)
        time.sleep(1)

if __name__ == "__main__":
    sing()
    dance()
he is singing..0.
he is singing..1.
he is singing..2.
he is dancing...0
he is dancing...1
he is dancing...2

!!!注意

  • 很显然刚刚的程序并没有完成唱歌和跳舞同时进行的要求
  • 如果想要实现“唱歌跳舞”同时进行,那么就需要一个新的方法,叫做:多任务

2.进程的创建-fork

  1.) 进程 VS 程序

  编写完毕的代码,在没有运行的时候,称之为程序

  正在运行着的代码,就成为进程

  进程,除了包含代码以外,还有需要运行的环境等,所以和程序是有区别的

  2). fork( ) 创建子进程

  Python的os模块封装了常见的系统调用,其中就包括fork,可以在Python程序中轻松创建子进程:

    

  3.) getpid()、getppid()

import os

ret = os.fork()
print(ret)

if ret > 0 :
    print("---父进程- %d-"%os.getpid())

else:
    print("---子进程--%d--%d"%(os.getpid(),os.getppid()))
2241
---父进程- 2240-
0
---子进程--2241--2240
说明:

程序执行到os.fork()时,操作系统会创建一个新的进程(子进程),然后复制父进程的所有信息到子进程中
然后父进程和子进程都会从fork()函数中得到一个返回值,在子进程中这个值一定是0,而父进程中是子进程的 id号

   4)父子进程的先后顺序

import os
import time

ret = os.fork()
if ret == 0 :
    print("---子进程--")
    time.sleep(5)
    print("---子进程 over")
else:
    print("---父进程--")
    time.sleep(3)

print("---程序 over")
---父进程--
---子进程--
---程序 over
python@ubuntu:~/python06/03-多任务$ ---子进程 over
---程序 over
  • 父子进程的执行顺序

  • 父进程、子进程执行顺序没有规律,完全取决于操作系统的调度算法

3.全局变量,互不影响

import os
import time

g_num = 100

ret = os.fork()
if ret == 0 :
    print("---process 1---")
    g_num += 1
    print("---process-1  g_num=%d"%g_num)

else:
    time.sleep(1)
    print("---process-2")
    print("---process-2 g_num=%d"%g_num)
---process 1---
---process-1  g_num=101
---process-2
---process-2 g_num=100

    

总结:

  • 多进程中,每个进程中所有数据(包括全局变量)都各有拥有一份,互不影响

4.多次fork问题

  1)domo1

import os 
import time
#父进程
ret = os.fork()
if ret == 0:
    #子进程
    print("----1---")

else:
    #父进程
    print("----2---")

#父子进程
ret = os.fork()
if ret == 0:
    #孙子
    #2儿子
    print("----11---")
else:
    #儿子
    #父进程
    print("----22---")
----2---
----22---
----11---
----1---
----22---
----11---

··  

  

  2)domo2

import os 
import time
#父进程
ret = os.fork()
if ret == 0:
    #子进程
    print("----1---")

else:
    #父进程
    print("----2---")

    ret = os.fork()
    if ret == 0:
        #2儿子
        print("----11---")
    else:
        #父进程
        print("----22---")
# 注意,fork函数,只在Unix/Linux/Mac上运行,windows不可以
----2---
----22---
----11---
----1---

   3)domo3:fork炸弹

      

import os

ret = os.fork()
ret = os.fork()
ret = os.fork()
print("-----1----")


##  运行结果 8个
-----1----
-----1----
-----1----
-----1----
-----1----
-----1----
-----1----
-----1----

      

import os

ret = os.fork()
ret = os.fork()
## 下面是fork炸弹
while True:
    ret = os.fork()

print("-----1----")
原文地址:https://www.cnblogs.com/venicid/p/7954503.html