zoukankan      html  css  js  c++  java
  • [Python]第五课笔记 多进程及守护进程编写

    
    
    

    #python2.7 多进程多线程 

    #并行的世界

        *串行和并行
        *阻塞与非阻塞
        *共享和冲突
        *多进程和多线程:win下不支持多进程开发,多线程几乎所有的平台都可以开发
         

    #多进程

         *fork
         *wait
         *waitpid
         *pipe and singal(进程间通信)
    ?守护进程是什么


    ##########################fork演示########################

    #coding=utf-8
    #python2.7 
    '''
    多进程编程 fork wait waitpid pipe signle 
    '''
    import os 
    import signal #怎么用的 
    from time import ctime,sleep 
    
    
    def dealSigle(a,b):
        print 'game over'
        
    signal.signal(signal.SIGTERM,dealSigle)   
    
    
    def myfork():
        r,w = os.pipe() #管道的原理和使用?
        pid = os.fork()
        #pid = os.fork()
        #print 'pid is %s' %pid 
        a = 1 #judge in which process  
        if pid==0:
            os.close(r)
            w = os.fdopen(w,'w')
            print 'this is child %s--%s--%s'%(pid,os.getpid(),os.getppid()) #直接打印子进程,父进程 
            #sleep(1)
            print a+1
            if a == 1:
                os.kill(os.getpid,signal.SIGTERM)
            w.write('woshi haoren')
            w.close()
        else:    
            os.wait()
            os.close(w)
            r = os.fdopen(r)
            print r.read() 
            r.close()
            #print os.waitpid(pid,0)  #为什么会输出2次呢?
            print 'thss is parent %s--%s--%s'%(pid,os.getpid(),os.getppid()) 
            print a 
            
     
    if __name__=='__main__':
        myfork()



    ########################################################################

    守护进程的编写流程;

        *首先fork一个子进程,让父进程退出,把控制权还给命令行或者是shell
        *ssetsid()调用成功后,进程成为新的会话组长和新的进程组长,并与原来的登录 会话和进程组脱离。由于会话过程对控制终端的独占性,进程同时与控制终端脱离。
        *再次fork,这样的话父进程回话组长或者进程组长退出。子进程是一个非会话组头领进程,永远无法获得终端控制。
        *调用chdir()确认进程不保持任何目录于使用状态。
        *进程从创建它的父进程那里继承了文件创建掩模。它可能修改守护进程所创建的文件的存取位。为防止这一点,将文件创建掩模清除:umask(0); 
         

    #coding=utf8
    #python2.7 参考cookbook
    import os,sys
    
    
    def guardtest(stdin='/dev/null',stdout='/dev/null',stderr='/dev/null'):
        #首次fork
        try:
            pid = os.fork()
            if pid>0:
                sys.exit(0)
        except IOError,e:
            e.message
            sys.exit(1)
            
        #从母体分离
        os.chdir('/')
        os.setsid()
        os.umask(0)
        
        #第二次fork
        try:
            pid = os.fork()
            if pid>0:
                sys.exit(0)
        except OSError,e:
                sys.exit(1)
        #完成守护了
        for f in sys.stdout,sys.stderr: 
            f.flush()
        si = file(stdin,'r')
        so = file(stdout,'a+')
        se = file(stderr,'a+',0)
        os.dup2(si.fileno(),sys.stdin.fileno())
        os.dup2(so.fileno(),sys.stdout.fileno())
        os.dup2(se.fileno(),sys.stderr.fileno())
         
    def mains():
        import time
        sys.stdout.write('the input sid is %d'%os.getpid())
        sys.stdout.write('output wirtor')
        sys.stderr.write('err wirtor')
        c = 0
        for i in range(100):
            sys.stdout.write('No %d and time is %s \n'%(c,time.ctime()))
            sys.stdout.flush()
            c+=1
    if __name__=='__main__':
        guardtest('/dev/null','/tmp/deamon.log','/tmp/deamon.log')
        mains() 
        







             



  • 相关阅读:
    小程序学习过程中遇到的问题
    小程序云函数调用webservice接口
    小程序云函数调用http或https请求外部数据
    MQTT Web Toolkit
    mqtt.mini.js 使用
    MQTT 浏览器 mqttws31.min.js
    MQTT.js browser node 均支持
    mqtt开源服务器 EMQX ,客户端MQTTX5.0,使用指南
    vue调试工具vue-devtools安装及使用方法
    Js 类继承 extends
  • 原文地址:https://www.cnblogs.com/xinyuyuanm/p/3014153.html
Copyright © 2011-2022 走看看