TwistedWeb on multicore/multiprocessor

前端 未结 3 407
庸人自扰
庸人自扰 2020-12-13 01:07

What techniques are people using to utilize multiple processors/cores when running a TwistedWeb server? Is there a recommended way of doing it?

My twisted.web based

3条回答
  •  轮回少年
    2020-12-13 01:25

    If you wish to serve your web content over HTTPS as well, this is what you will need to do on top of @Jean-Paul's snippet.

    from twisted.internet.ssl import PrivateCertificate
    from twisted.protocols.tls import TLSMemoryBIOFactory
    
    '''
    Original snippet goes here
    ..........
    ...............
    '''
    
    privateCert = PrivateCertificate.loadPEM(open('./server.cer').read() + open('./server.key').read())
    tlsFactory = TLSMemoryBIOFactory(privateCert.options(), False, factory)
    reactor.adoptStreamPort(fd, AF_INET, tlsFactory)
    

    By using fd, you will serve either HTTP or HTTPS but not both. If you wish to have both, listenSSL on the parent process and include the ssl fd you get from the ssl port as the second argument when spawning the child process.

    Complete snipper is here:

    from os import environ
    from sys import argv, executable
    from socket import AF_INET
    
    from twisted.internet import reactor
    from twisted.web.server import Site
    from twisted.web.static import File
    
    from twisted.internet import reactor, ssl
    from twisted.internet.ssl import PrivateCertificate
    from twisted.protocols.tls import TLSMemoryBIOFactory
    
    def main(fd=None, fd_ssl=None):
        root = File("/var/www")
        factory = Site(root)
    
        spawned = []
        if fd is None:
            # Create a new listening port and several other processes to help out.                                                                     
            port = reactor.listenTCP(8080, factory)
            port_ssl = reactor.listenSSL(8443, factory, ssl.DefaultOpenSSLContextFactory('./server.key', './server.cer'))
            for i in range(3):
                child = reactor.spawnProcess(
                    None, executable, [executable, __file__, str(port.fileno()), str(port_ssl.fileno())],
                    childFDs={0: 0, 1: 1, 2: 2, port.fileno(): port.fileno(), port_ssl.fileno(): port_ssl.fileno()},
                    env=environ)
                spawned.append(child)
        else:
            # Another process created the port, just start listening on it.                                                                            
            port = reactor.adoptStreamPort(fd, AF_INET, factory)
            cer = open('./server.cer')
            key = open('./server.key')
            pem_data = cer.read() + key.read()
            cer.close()
            pem.close()
            privateCert = PrivateCertificate.loadPEM(pem_data )
            tlsFactory = TLSMemoryBIOFactory(privateCert.options(), False, factory)
            reactor.adoptStreamPort(fd_ssl, AF_INET, tlsFactory)
    
        reactor.run()
    
        for p in spawned:
            p.signalProcess('INT')
    
    
    if __name__ == '__main__':
        if len(argv) == 1:
            main()
        else:
            main(int(argv[1:]))
    

提交回复
热议问题