forked from shell909090/webserver
/
serve.py
96 lines (81 loc) · 2.61 KB
/
serve.py
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
#!/usr/bin/python
# -*- coding: utf-8 -*-
'''
@date: 2012-09-03
@author: shell.xu
'''
import time
import socket
import signal
import logging
from . import utils
from . import http
from threading import Thread
class ThreadServer(object):
def __init__(self, addr, handler, poolsize=10):
self.addr, self.poolsize, self.go = addr, poolsize, True
self.handler = handler
def run(self):
while self.go:
try:
self.handler(*self.listensock.accept())
except KeyboardInterrupt:
break
except Exception:
pass
siglist = [signal.SIGTERM, signal.SIGINT]
def signal_handler(self, signum, frame):
if signum in self.siglist:
self.go = False
raise KeyboardInterrupt()
def serve_forever(self):
logging.info('WebServer started at %s:%d' % self.addr)
self.listensock = socket.socket()
self.listensock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
self.listensock.bind(self.addr)
self.listensock.listen(10000)
try:
for si in self.siglist:
signal.signal(si, self.signal_handler)
self.pool = [Thread(target=self.run)
for i in xrange(self.poolsize)]
for th in self.pool:
th.setDaemon(1)
for th in self.pool:
th.start()
while True:
time.sleep(1000)
for th in self.pool:
th.join()
finally:
logging.info('system exit')
self.listensock.close()
def main():
cfg = utils.getcfg([
'serve.conf', '~/.webserver/serve.conf', '/etc/webserver/serve.conf'
])
utils.initlog(cfg.get('log', 'loglevel'), cfg.get('log', 'logfile'))
addr = (cfg.get('main', 'addr'), cfg.getint('main', 'port'))
engine = cfg.get('server', 'engine')
if engine == 'apps':
import apps
ws = http.WebServer(apps.dis, cfg.get('log', 'access'))
elif engine == 'wsgi':
import app_webpy
ws = http.WSGIServer(app_webpy.app.wsgifunc(), cfg.get('log', 'access'))
else:
raise Exception('invaild engine %s' % engine)
server = cfg.get('server', 'server')
if server == 'gevent':
from gevent.server import StreamServer
ws = StreamServer(addr, ws.handler)
elif server == 'thread':
ws = ThreadServer(addr, ws.handler)
else:
raise Exception('invaild server %s' % server)
try:
ws.serve_forever()
except KeyboardInterrupt:
pass
if __name__ == '__main__':
main()