您的位置:首页 > 编程语言 > Python开发

[Python]第五课笔记 --多进程及守护进程编写

2013-04-11 11:58 441 查看


#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()
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: