[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() 
    







         



原文地址:https://www.cnblogs.com/xinyuyuanm/p/3014153.html