# 注意,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----")