Skip to content

Instantly share code, notes, and snippets.

@wallrj
Created June 30, 2013 22:05
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save wallrj/87ba789dfc00d35d2307 to your computer and use it in GitHub Desktop.
Save wallrj/87ba789dfc00d35d2307 to your computer and use it in GitHub Desktop.
A simple multi cpu twisted dns server on a single ip/port.
import multiprocessing
import os
import socket
import time
from twisted.python.components import proxyForInterface
from twisted.internet.interfaces import IResolver
from twisted.names import dns, root, server
class PrintingResolver(proxyForInterface(IResolver)):
def __init__(self, original):
self.original = original
def query(self, *args, **kwargs):
print "QUERY IN CHILD", os.getpid()
time.sleep(0.1)
return self.original.query(*args, **kwargs)
def startChild(socketFD, socketFamily):
from twisted.internet import reactor
rootAddresses = [
socket.gethostbyname(d + '.root-servers.net')
for d in 'abcdefghijklm']
s = server.DNSServerFactory(
clients=[
PrintingResolver(
root.Resolver(
hints=rootAddresses,
reactor=reactor))])
p = dns.DNSDatagramProtocol(controller=s, reactor=reactor)
reactor.adoptDatagramPort(socketFD, socketFamily, p)
reactor.run()
raise SystemExit()
def main():
print "PARENT", os.getpid()
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.setblocking(False)
sock.bind(('127.0.0.1', 10053))
childpids = []
for i in range(min(multiprocessing.cpu_count(), 2)):
pid = os.fork()
if pid == 0:
startChild(sock.fileno(), socket.AF_INET)
else:
print "CHILD", pid
childpids.append(pid)
for pid in childpids:
os.waitpid(pid, 0)
if __name__ == '__main__':
main()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment