1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129
| from threading import Thread
from Queue import Queue as ThreadQueue
from wsgiref.simple_server import WSGIServer, WSGIRequestHandler
# ------------------------------------------------------------------------------
# Support multithread
# ------------------------------------------------------------------------------
class WSGIThreadWorker(Thread):
def __init__(self, pServer, pQueue, pName):
Thread.__init__(self, name=pName)
self.__queue = pQueue
self.__server = pServer
def run(self):
while True:
try:
lRequest, lClientAddress = self.__queue.get()
try:
self.__server.finish_request(lRequest, lClientAddress)
self.__server.close_request(lRequest)
except:
self.__server.handle_error(lRequest, lClientAddress)
self.__server.close_request(lRequest)
self.__queue.task_done()
except:
break
class WSGIThreadedServer(WSGIServer):
def __init__(self, pServerAddress, pRequestHandlerClass, pMaxThread = 5, pBindAndActivate=True):
WSGIServer.__init__(self, server_address = pServerAddress, RequestHandlerClass = pRequestHandlerClass, bind_and_activate = pBindAndActivate)
self.__maxThread = pMaxThread
self.__queue = ThreadQueue()
self.__threads = []
def set_app(self,pApplication):
WSGIServer.set_app(self,pApplication)
for i in range(self.__maxThread):
lNewThreadWorker = WSGIThreadWorker(pServer = self, pQueue = self.__queue, pName = "WSGIThreadWorker-" + str(i+1))
lNewThreadWorker.daemon = True
lNewThreadWorker.start()
self.__threads += [lNewThreadWorker]
def process_request(self, pRequest, pClientAddress):
self.__queue.put((pRequest,pClientAddress))
def make_multithread_server(pHost, pPort, app, pMaxThread = 5, pServerClass=WSGIThreadedServer, pHandlerClass=WSGIRequestHandler):
lServer = pServerClass((pHost, pPort), pHandlerClass, pMaxThread = pMaxThread)
lServer.set_app(app)
return lServer
# ------------------------------------------------------------------------------
# Support multiprocess
# ------------------------------------------------------------------------------
import socket
from multiprocessing import Process, Queue as ProcessQueue
from multiprocessing.reduction import reduce_handle, rebuild_handle
try:
from setproctitle import setproctitle
except:
import sys
print('Error: install package "setproctitle"\nCommand: pip install setproctitle')
sys.exit(0)
class WSGIProcessWorker(Process):
def __init__(self, pServer, pQueue, pName):
Process.__init__(self,name=pName)
self.__server = pServer
self.__queue = pQueue
def run(self):
setproctitle(self.name)
while True:
try:
lHandle, lClientAddress = self.__queue.get()
lFd = rebuild_handle(lHandle)
lRequest = socket.fromfd(lFd, socket.AF_INET, socket.SOCK_STREAM)
try:
self.__server.finish_request(lRequest, lClientAddress)
self.__server.close_request(lRequest)
except:
self.__server.handle_error(lRequest, lClientAddress)
self.__server.close_request(lRequest)
except:
break
class WSGIProcessServer(WSGIServer):
def __init__(self, pServerAddress, pRequestHandlerClass, pMaxProcess = 2, pBindAndActivate=True, pProcessName = None):
WSGIServer.__init__(self, server_address = pServerAddress, RequestHandlerClass = pRequestHandlerClass, bind_and_activate = pBindAndActivate)
self.__maxProcess = pMaxProcess
self.__queue = ProcessQueue()
self.__process = []
self.__processName = pProcessName
def serve_forever(self, pPoll_interval=0.5):
try:
WSGIServer.serve_forever(self, poll_interval=pPoll_interval)
except:
import os
for lProcess in self.__process:
os.kill(lProcess.pid, 9) # SIGKILL
def set_app(self,pApplication):
WSGIServer.set_app(self,pApplication)
if self.__processName is not None:
setproctitle(self.__processName)
for i in range(self.__maxProcess):
lNewProcessWorker = WSGIProcessWorker(pServer = self, pQueue = self.__queue, pName = "WSGIProcessWorker-" + str(i+1) )
lNewProcessWorker.daemon = True
lNewProcessWorker.start()
self.__process += [lNewProcessWorker]
def process_request(self, pRequest, pClientAddress):
lParam = [ reduce_handle(pRequest.fileno()), pClientAddress]
self.__queue.put(lParam)
def make_multiprocess_server(pHost, pPort, app, pMaxProcess = 5, pServerClass=WSGIProcessServer, pHandlerClass=WSGIRequestHandler, pProcessName = None):
lServer = pServerClass((pHost, pPort), pHandlerClass, pMaxProcess = pMaxProcess)
lServer.set_app(app)
return lServer |
Partager