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...
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的更多相关文章
- Unix/Linux/Mac os下 文件互传
说起文件互传,就不得不提命令scp. 他是Secure copy的缩写,使用ssh连接和加密方式, 如果两台机器之间配置了ssh免密登录, 那在使用scp的时候可以不用输入密码. scp 和 cp ...
- 常用mac/unix/linux命令
1.查询ip地址 ifconfig 2.查找服务器上应用程序的端口分配 grep telnet /etc/services (telnet) telnet使用TCP/UDP端口号23 grep dom ...
- 获得Unix/Linux系统中的IP、MAC地址等信息
获得Unix/Linux系统中的IP.MAC地址等信息 中高级 | 2010-07-13 16:03 | 分类:①C语言. Unix/Linux. 网络编程 ②手册 | 4,471 次阅读 ...
- 浅谈 unix, linux, ios, android 区别和联系
浅谈 unix, linux, ios, android 区别和联系 网上的答案并不是很好,便从网上整理的相对专业的问答,本人很菜,大佬勿喷 UNIX 和 Linux UNIX 操作系统(尤尼斯) ...
- Unix/Linux 从哪儿来?那些改变世界的人们...
昨天看文章时发现自己对 linux 操作系统不够了解,还记得 17 年时听过老师的一些课,对 linux 的历史有一点了解,不过当时并没有记录笔记,现在已经忘的差不多了. 这次从网上找资料,又重新看了 ...
- Windows与Linux/Mac系统时间不一致的解决方法
Windows与Linux/Mac系统时间不一致的解决方法 分类: linux2012-02-12 14:25 1691人阅读 评论(1) 收藏 举报 windowsubuntusystemlinux ...
- Unix/Linux之命令备忘录
ps:是显示瞬间进程的状态,并不动态连续 kill:用于杀死进程或者给进程发送信号 // 在Linux下查看所有java进程命令 ps -ef | grep java: // 停止所有java进程命 ...
- Unix/Linux环境C编程新手教程(22) C/C++怎样获取程序的执行时间
1.问:知道程序执行时间我们能够做什么? 在<C++应用程序性能优化>一书中,假设大家读过相信大家一定对性能优化这一块很上心,文中总是对优化前后的时间对照很直观给我们一个感受. 那么我们怎 ...
- Unix/Linux环境C编程入门教程(25) C/C++字符测试那些事儿
isalnum isalpha isascii iscntrl isdigit isgraph isislower isprint isspace ispunct isupper isxdigit介绍 ...
随机推荐
- apache log4j-1.2.15的使用
1.这个log4j的下载 下载 http://www.apache.org/dyn/closer.cgi/logging/log4j/1.2.15/apache-log4j-1.2.15.zip 2. ...
- javascript中数组的22种方法 (转载)
前面的话 数组总共有22种方法,本文将其分为对象继承方法.数组转换方法.栈和队列方法.数组排序方法.数组拼接方法.创建子数组方法.数组删改方法.数组位置方法.数组归并方法和数组迭代方法共10类来进行详 ...
- Crontab 学习
分钟 小时 日期 月份 星期几 整点执行 0 8-22 * * * /usr/bin/php /home/anbaojia/wwwroot/shjn/yii report/sync 查看 cron 执 ...
- IOS9中使用NSURLConection发送异步网络请求
IOS9中使用NSURLConection发送异步网络请求 在ios9中,NSURLConection的sendSync..和sendAsync已经过时.被NSURLSession代替. 以下蓝色部分 ...
- Kindeditor图片上传Controller
asp.net MVC Kindeditor 图片.文件上传所用的Controller [HttpPost, AllowAnonymous] public ActionResult UploadIma ...
- ASP.NET教程
1.ASP.NET是一个使用Html Css JavaScript和服务器脚本创建网页和网站的开发框架 2.ASP.NET支持三种开发模式:WebPages(Web页面).MVC(Model View ...
- Java之变量
Java变量分为类变量.实例变量.局部变量: 类变量包括静态变量: 局部变量:就是本地变量,使用范围:方法,构造器(构造方法),块:销毁:程序执行完或退出立即销毁:局部变量没有默认值,声明的同时必须赋 ...
- 20181029NOIP模拟赛T3
3 .空间活动 [题目描述] 贝茜和佩奇正在玩一款游戏,在游戏开始会生成一个有n个点m条单向边的地图,经过每条边需要花费价格为Hi的费用(Hi<=1000).但是如果两个点可以互相到达,那么这两 ...
- ubnutu 安装protocol buffer
工作中需要使用protocol buffer,需要编译出protocol buffer的动态链接库,然后在别的makefile中链接它, 我的环境是ubnutu16.04,64bit,使用的proto ...
- MySQL常用参数说明(持续更新)
##innodb correlate innodb_flush_log_at_trx_commit value: 0,[1],2 effect: control the flush opera ...