#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 參考cookbookimport os,sysdef 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+=1if __name__=='__main__': guardtest('/dev/null','/tmp/deamon.log','/tmp/deamon.log') mains()