マルチソケット

socket.fromfd でやればよし。TCP はまぁおいといて、UDP を淡々と。TCP は Erlang でいいし:-P
一応動作確認 CPU 400% が確認できました ... マルチコアええね。

# vim: fileencoding=utf8

# Only Python 2.6.x
from __future__ import division
from __future__ import absolute_import
from __future__ import print_function
#from __future__ import unicode_literals

from future_builtins import *

import os
import sys
import socket
import logging
import multiprocessing
import Queue

import struct

# Linux Kernel 2.6 Only
from select import *

logging.basicConfig(
  level=logging.DEBUG,
  format='%(asctime)s %(pathname)s %(lineno)d %(levelname)-6s %(message)s',
)

class Server(object):
  def __init__(self, address, first_port, second_port):
    self.address = address
    self.first_port = first_port
    self.first_sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    self.first_sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    self.first_sock.bind((address, first_port))
    logging.info('start: %s:%d' % (self.address, self.first_port,))

    self.second_port = second_port
    self.second_sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    self.second_sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    self.second_sock.bind((address, second_port))
    logging.info('start: %s:%d' % (self.address, self.second_port,))

    self.queue = multiprocessing.Queue()
    self.processes = []
    self.ep = epoll(1024)
    self.ep.register(self.first_sock.fileno())
    self.ep.register(self.second_sock.fileno())

  def run(self):
    while True:
      try:
        (fd, packet, address, port) = self.queue.get(block=True, timeout=60)
        pid = multiprocessing.current_process().pid
        sock = socket.fromfd(fd, socket.AF_INET, socket.SOCK_DGRAM)
        sock.sendto(packet, (address, port))
      except Queue.Empty, e:
        logging.info('queue empty: %d' % (os.getpid()))
      except Exception, e:
        logging.error(e)
      except:
        pass

  def start(self):
    for i in range(multiprocessing.cpu_count()):
      p = multiprocessing.Process(target=self.run)
      self.processes.append(p)
      p.start()
    try:
      while True:
        for (fd, ev) in self.ep.poll():
          if ev & EPOLLIN:
            sock = socket.fromfd(fd, socket.AF_INET, socket.SOCK_DGRAM)
            packet, (address, port) = sock.recvfrom(8192)
            self.queue.put((fd, packet, address, port))
    except Exception, e:
      logging.error(e)
    except:
      self.stop()

  def stop(self):
    logging.info('stop: %s:%d' % (self.address, self.first_port,))
    logging.info('stop: %s:%d' % (self.address, self.second_port,))
    for p in self.processes:
      logging.info('process terminate: %d' % (p.pid,))
      p.terminate()
    self.ep.close()
    logging.info('epoll close')
    self.first_sock.close()
    logging.info('first socket close')
    self.second_sock.close()
    logging.info('second socket close')

if __name__ == '__main__':
  Server('127.0.0.1', 5001, 5002).start()

追記

色々問題があったので書き直しました。これで正常に動くと思われます。