# 注意,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...
he is singing...
he is singing...
he is dancing...
he is dancing...
he is dancing...

!!!注意

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

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----")

最新文章

  1. Loadrunner11安装和破解方法
  2. PHPstorm--ThinkStorm安装
  3. div的一些易出错地方
  4. js获取随机色
  5. 简单的自绘CListBox,重载虚MeasureItem和DrawItem这两个虚函数
  6. 如何在Android应用程序中使用传感器(OpenIntents开源组织SensorSimulator项目)
  7. [python] 视频008
  8. 转:分享13款PHP开发框架
  9. 登陆页面改为SSO验证
  10. Angular2 VS Angular4 深度对比:特性、性能
  11. MySQL参数log_bin_trust_function_creators介绍
  12. JavaScript之BOM
  13. 在Android中afinal框架下实现sqlite数据库版本升级的办法
  14. MySQL安装及环境搭建
  15. 自制操作系统Antz(8)——实现内核 (中) 扩展内核
  16. liunx安装nginx
  17. PHP金额工具类之将阿利伯数字转换为大写中文数字
  18. Mudo C++网络库第十一章学习笔记
  19. iPhone IOS10安装APP没提示连接网络(无法联网)的解决办法
  20. 洛谷.2197.nim游戏(博弈论 Nim)

热门文章

  1. springmvc使用map接收form表单的参数
  2. Struts2注解 及 约定优于配置
  3. hpp.h与.h的区别
  4. 使用QT开发GoogleMap瓦片显示和下载工具(2)——Google地图瓦片投影和获取网址解析
  5. 根据身份证获取地址(mysql)
  6. [转]表单提交:button input submit 的区别
  7. iOS应用软件沙盒sandbox相关知识(整理)
  8. 关于session序列化和session钝化和活化
  9. Maven项目改为spring boot项目的方法
  10. python 使用gRPC