# 注意,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. 获取Spring管理的Bean

    1.再Spring配置文件中配置工具类 <!-- 用于持有ApplicationContext,可以使用SpringContextHolder.getBean('xxxx')的静态方法得到spr ...

  2. Linux学习总结(九)-源码包和rpm包安装

    一.源码包安装 通常办法是安装三部曲:./configuremakemake install但是具体还要根据包里面的帮助文档操作./configure --help 可以查看可以带什么参数,比如--p ...

  3. Windows平台JxCore打包

    1.下载JxCore https://raw.githubusercontent.com/jxcore/jxcore-release/master/0311/jx_win64v8.zip 2.解压并配 ...

  4. vue使用element案列

    第一步:使用vue创建项目‘ 第二步:在项目添加element cmd:vue add element demo:https://github.com/weibanggang/vuemode.git

  5. java根据数据库自动生成代码

    出现这个已经创建成功 出现这个情况,没有使用DBUtil,引入即可 已经创建完成 代码下载:https://github.com/weibanggang/tool 项目实例下载:https://pan ...

  6. Msql数据库连接写一个共有的连接工具

    为了避免在每一个DAO中都需要自行连接connection,有多个DAO里都需要获取数据库的连接,并且在很多项目中都是一样的数据库连接. 所以就可以把获取数据库连接的代码重构到一个类里. 这样做的好处 ...

  7. openmax component类的继承关系

    向OpenCORE里继承一个新的codec时,需要用到OpenMAX接口规范对该codec进行封装,即要定义一个用于封装的类(wrapper),实现OpenMAX规定的集中核心方法(omx core  ...

  8. LeetCode27.移除元素 JavaScript

    给定一个数组 nums 和一个值 val,你需要原地移除所有数值等于 val 的元素,返回移除后数组的新长度. 不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成 ...

  9. NAT和DHCP

    涉及的命令 NAT 动态NAT清除:clear ip nat translation * 进入路由器环回接口:int loo 0 静态NAT清除: (config)#No ip nat inside ...

  10. HTML中IMG标签总结

    一.Img标签有两个重要的属性: 1.src  属性:图片的地址 2.alt  属性:图片不显示是现实的文字 二.Img标签是行级元素: img.input属于行内替换元素.height/width/ ...