Chinaunix首页 | 论坛 | 博客
  • 博客访问: 821255
  • 博文数量: 91
  • 博客积分: 2544
  • 博客等级: 少校
  • 技术积分: 1885
  • 用 户 组: 普通用户
  • 注册时间: 2006-12-12 09:08
文章存档

2016年(10)

2014年(2)

2013年(4)

2012年(23)

2011年(23)

2010年(13)

2009年(14)

2007年(2)

分类: LINUX

2016-05-12 11:07:29

该代码会开启NPROCES 个进程来进行echo的服务,若其中一个退出,会马上创建一个新的进程进入进程池中,
而不是等待下一个客户端连接来的时候才创建新的进程。这样你就有了一个一直保持NPROCES 个进程的进程池。 
当然,以下程序只是一个模型程序,用来实现该思想。在实际的网络编程过程中还需要在该模型上进行优化。
该模型对于一些要保持高可用的服务,或自动恢复的服务还是比较有用。

点击(此处)折叠或打开

  1. 请注意python中进程中进程的回收和再生过程,不是简单的join

  2. #!/usr/bin/env python
  3. # encoding: utf-8
  4. #
  5. #-------------------------------------------------------------------------------
  6. #
  7. # 进程池实现socket server.
  8. #
  9. #-------------------------------------------------------------------------------

  10. import os
  11. import time
  12. import socket
  13. import multiprocessing as mp
  14. from signal import signal, SIGINT, SIG_IGN, siginterrupt
  15. from time import ctime


  16. BUFSIZ = 1024
  17. NPROCES = 8


  18. def worker(listen_sock, ctlq, exit_flag):
  19.     #while True:
  20.     cli_sock, addr = listen_sock.accept()

  21.     if exit_flag.is_set():
  22.         ctlq.put({'event': 'exit', 'pid': os.getpid()})

  23.     while True:
  24.         data = cli_sock.recv(1024)
  25.         print data
  26.         if data.strip().lower() == "exit" or data.strip().lower() == "quit":
  27.             break
  28.         if not data:
  29.             break
  30.         cli_sock.send("[%s] %s" % (ctime(), data))
  31.     cli_sock.close()
  32.     ctlq.put({'event': 'exit', 'pid': os.getpid()})

  33. def main_loop(host, port):
  34.     '''
  35.     基础服务01
  36.     '''
  37.     proc_pool = {}
  38.     ctlq = mp.Queue()
  39.     exit_flag = mp.Event()

  40.     signal(SIGINT, lambda x, y: exit_flag.set())
  41.     siginterrupt(SIGINT, False)

  42.     listen_sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  43.     listen_sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
  44.     listen_sock.bind((host,port))
  45.     listen_sock.listen(128)

  46.     for i in range(NPROCES):
  47.         child = mp.Process(target=worker, args=(listen_sock, ctlq, exit_flag))
  48.         child.start()
  49.         proc_pool[child.pid] = child
  50.         print 'worker {} started'.format(child.pid)

  51.     while True:
  52.         print "parent join child process..."
  53.         item = ctlq.get()
  54.         if item['event'] == 'exit':
  55.             proc = proc_pool.pop(item['pid'])
  56.             proc.join()
  57.             print 'child {} stopped'.format(item['pid'])

  58.             # if child died, create new worker
  59.             child = mp.Process(target=worker, args=(listen_sock, ctlq, exit_flag))
  60.             child.start()
  61.             proc_pool[child.pid] = child
  62.             print 'worker {} started'.format(child.pid)
  63.         else:
  64.             print "It's impossible."

  65. def main():
  66.     main_loop("0.0.0.0", 58001)

  67. if __name__ == '__main__':
  68.     main()


阅读(2034) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~