python 多进程,多线程,守护进程,UDP
1.导入模块
进程间通信使用Queue,
注意:如果要使用Manager模块中的dict和list则不能使用os.fork,有冲突
#!/usr/bin/env python # -*- coding: utf-8 -*- from socket import * from multiprocessing import Process, Queue import thread import os, time import sys
2.绑定UDP端口
HOST = '' PORT = 40000 BUFSIZ = 1024 ADDR = (HOST, PORT) # SOCK_DGRAM 是UDP协议,socket初始化默认值:family=AF_INET, type=SOCK_STREAM, proto=0, _sock=None udpServer = socket(AF_INET, SOCK_DGRAM) udpServer.bind(ADDR) queue = Queue() # define queue to save udp data
3.编写进程方法
方法1 是普通方法
方法2 里面 通过 thread 类 启动了多线程
main()方法里 通过 Process类 启动了多进程,主进程是个死循
def method_1 (arg1, arg2):
pass
def method_2 (arg1, arg2):
thread.start_new_thread(method_1,(arg1,arg2,))
pass
def main():
arg_1 = ''
arg_2 = ''
read_set = Process(target=method_2, args=(arg_1, arg_2,)) # use set ip static ip
read_set.start()
while True:
ip_traffic, addr = udpServer.recvfrom(BUFSIZ)
queue.put(ip_traffic)
4.编写main函数
if __name__ == "__main__":
# do the UNIX double-fork magic, see Stevens' "Advanced
# Programming in the UNIX Environment" for details (ISBN 0201563177)
try:
# 产生子进程,而后父进程退出
pid = os.fork()
if pid > 0:
sys.exit(0)
except OSError, e:
print >>sys.stderr, "fork #1 failed: %d (%s)" % (e.errno, e.strerror)
sys.exit(1)
# 修改子进程工作目录
os.chdir("/")
# 创建新的会话,子进程成为会话的首进程
os.setsid()
# 修改工作目录的umask
os.umask(0)
try:
# 创建孙子进程,而后子进程退出
pid = os.fork()
if pid > 0:
# exit from second parent, print eventual PID before
print "Daemon PID %d" % pid
sys.exit(0)
except OSError, e:
print >>sys.stderr, "fork #2 failed: %d (%s)" % (e.errno, e.strerror)
sys.exit(1)
# 刷新缓冲区先,小心使得万年船
sys.stdout.flush()
sys.stderr.flush()
# 孙子进程的程序内容
main()
5.守护进程解释
守护进程英文为daemon, 像httpd,mysqld, vsftpd最后个字母d其实就是表示daemon的意思
守护进程的编写步骤:
1.fork子进程,而后父进程退出,此时子进程会被init进程接管
2.修改子继承的工作目录,创建新进程组和新会话,修改umask
3.子进程再次fork一个进程,这个进程可以称为孙子进程,而后子进程退出。
4.重定向孙子进程的标准输入流、标准输出流,标准错误流到/dev/null
完成上面的4个步骤,name最终的孙子进程就称为守护进程。先看下代码,后面再分析下每个步骤的原因
参考 https://my.oschina.net/guol/blog/122710
没有什么是写一万遍还不会的,如果有那就再写一万遍。

浙公网安备 33010602011771号