# 注意,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 多任务fork Unix/Linux/Mac的更多相关文章

  1. Unix/Linux/Mac os下 文件互传

    说起文件互传,就不得不提命令scp. 他是Secure copy的缩写,使用ssh连接和加密方式, 如果两台机器之间配置了ssh免密登录, 那在使用scp的时候可以不用输入密码.  scp 和 cp ...

  2. 常用mac/unix/linux命令

    1.查询ip地址 ifconfig 2.查找服务器上应用程序的端口分配 grep telnet /etc/services (telnet) telnet使用TCP/UDP端口号23 grep dom ...

  3. 获得Unix/Linux系统中的IP、MAC地址等信息

    获得Unix/Linux系统中的IP.MAC地址等信息 中高级  |  2010-07-13 16:03  |  分类:①C语言. Unix/Linux. 网络编程 ②手册  |  4,471 次阅读 ...

  4. 浅谈 unix, linux, ios, android 区别和联系

    浅谈 unix, linux, ios, android 区别和联系 网上的答案并不是很好,便从网上整理的相对专业的问答,本人很菜,大佬勿喷 UNIX 和 Linux   UNIX 操作系统(尤尼斯) ...

  5. Unix/Linux 从哪儿来?那些改变世界的人们...

    昨天看文章时发现自己对 linux 操作系统不够了解,还记得 17 年时听过老师的一些课,对 linux 的历史有一点了解,不过当时并没有记录笔记,现在已经忘的差不多了. 这次从网上找资料,又重新看了 ...

  6. Windows与Linux/Mac系统时间不一致的解决方法

    Windows与Linux/Mac系统时间不一致的解决方法 分类: linux2012-02-12 14:25 1691人阅读 评论(1) 收藏 举报 windowsubuntusystemlinux ...

  7. Unix/Linux之命令备忘录

    ps:是显示瞬间进程的状态,并不动态连续 kill:用于杀死进程或者给进程发送信号 // 在Linux下查看所有java进程命令 ps -ef | grep java: //  停止所有java进程命 ...

  8. Unix/Linux环境C编程新手教程(22) C/C++怎样获取程序的执行时间

    1.问:知道程序执行时间我们能够做什么? 在<C++应用程序性能优化>一书中,假设大家读过相信大家一定对性能优化这一块很上心,文中总是对优化前后的时间对照很直观给我们一个感受. 那么我们怎 ...

  9. Unix/Linux环境C编程入门教程(25) C/C++字符测试那些事儿

    isalnum isalpha isascii iscntrl isdigit isgraph isislower isprint isspace ispunct isupper isxdigit介绍 ...

随机推荐

  1. 为什么说 Java 程序员必须掌握 Spring Boot ?

    原作者https://www.cnblogs.com/ityouknow/p/9175980.html Spring Boot 2.0 的推出又激起了一阵学习 Spring Boot 热,就单从我个人 ...

  2. 2018 Multi-University Training Contest 4 Problem J. Let Sudoku Rotate 【DFS+剪枝+矩阵旋转】

    任意门:http://acm.hdu.edu.cn/showproblem.php?pid=6341 Problem J. Let Sudoku Rotate Time Limit: 2000/100 ...

  3. 第六章.MyBatis缓存结构

    一级缓存 测试案例: MyBatisTest.java //缓存 @Test public void testFindCustomerCache1() throws Exception{ SqlSes ...

  4. android:windowSoftInputMode属性详解 软键盘

    android:windowSoftInputMode activity主窗口与软键盘的交互模式,可以用来避免输入法面板遮挡问题,Android1.5后的一个新特性. 这个属性能影响两件事情: [一] ...

  5. iOS 8及以后版本 如何创建UIAlertView?

    1. Important: UIAlertView is deprecated in iOS 8. (Note that UIAlertViewDelegate is also deprecated. ...

  6. ARM 汇编指令集 特点之一:条件执行后缀

    mov r0,r1; moveq r0,r1;//这句代码是否执行 取决于 上几句代码 的运行结果(最后一次CPSR 寄存器 的 高四位   NZCV 的标志位) 条件后缀执行特点:1.条件后缀执行是 ...

  7. mysql错误errno:121

    121错误是因为外键名重复.在同一个库中外键是不允许与其他外键重名的. 遇到这个错误请给你定义的外键换唯一无重复的名字. 同时查阅到外键也有可能导致150错误. Can't create table ...

  8. oracle静默安装

    RHEL6+oracle11.2 无界面化命令安装如下: 1.所需安装软件包检查: yum install binutils-2.* compat-libcap1* compat-libstdc++- ...

  9. OC - KVO实现原理

    1.KVO简介 KVO是Objective-C对观察者设计模式的一种实现,它提供一种机制,指定一个被观察对象(如A类),当对象中的某个属性发生变化的时候,对象就会接收到通知,并作出相应的处理.在MVC ...

  10. show status 查看各种状态

    要查看MySQL运行状态,要优化MySQL运行效率都少不了要运行show status查看各种状态,下面是参考官方文档及网上资料整理出来的中文详细解释: 如有问题,欢迎指正 状态名 作用域 详细解释 ...