zoukankan      html  css  js  c++  java
  • 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..0.
    he is singing..1.
    he is singing..2.
    he is dancing...0
    he is dancing...1
    he is dancing...2

    !!!注意

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

    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----")
  • 相关阅读:
    struts.xml
    web.xml
    jdbc.properties
    apache+tomcat的集群--Session复制配置
    mysql 定时触发器
    mysql 查看存储过程
    Quatz 定时任务
    Apache Httpd常用命令
    Mac安装nginx
    dubbo ReferenceConfig源码分析
  • 原文地址:https://www.cnblogs.com/venicid/p/7954503.html
Copyright © 2011-2022 走看看