# 注意,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. Architecture pattern & Architecture style

    Architecture pattern: context + problem -> solution Architecture style: solution part of architec ...

  2. SP34096 【DIVCNTK - Counting Divisors (general)】

    题目 求 \[\sum_{i=1}^n \sigma(i^k)\] 我们先来设一个函数\(f(i)=\sigma(i^k)\) 根据约数个数定理 \[f(p)=\sigma(p^k)=k+1\] \[ ...

  3. Jenkins+maven(testng)项目(本地项目配置)

    一.前提: 1. Jenkins下载安装. 2. testng的Maven项目. 二.检测: maven项目自身配置及检测. 1. POM.XML配置文件增加: <build> <p ...

  4. alibaba--java规范

    18. [推荐]final 可以声明类.成员变量.方法.以及本地变量,下列情况使用 final 关键字: 1) 不允许被继承的类,如:String 类. 2) 不允许修改引用的域对象,如:POJO 类 ...

  5. Jmeter--HTTPS请求

    (1)新建threadGroup:                               (2)设置并发用户数量:                                     (3) ...

  6. LeetCode27.移除元素 JavaScript

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

  7. scrapy从安装到爬取煎蛋网图片

    下载地址:https://www.lfd.uci.edu/~gohlke/pythonlibs/pip install wheelpip install lxmlpip install pyopens ...

  8. OpenGL 3 and OpenGL 4 with GLSL

    Here are some OpenGL samples with advance features. NeHe OpenGL tutorial focus on the OpenGL fixed p ...

  9. windows搭建本地IIS服务器+php安装+移动设备内网访问服务器

    启动IIS服务 1. 打开 “控制面板” => "程序" => "启用或关闭Window功能": 2. 接着勾选相应设置: 3. 继续勾选对应目录下 ...

  10. 搜索 水题&&错误集锦

    引子: 本以为搜索的题目老师也不会检查,结果今天早上loli慢悠悠的说:“请同学们提交一下搜索的题目~”,顿时心旌摇曳,却也只能装作镇定自若的样子,点了点头.. 然后就开始了今天的疯狂做题,虽说题目都 ...