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

 

posted @ 2017-10-17 16:04  瓦肯船长  阅读(360)  评论(0)    收藏  举报