ยปCore Development>Code coverage>Doc/includes/mp_webserver.py

Python code coverage for Doc/includes/mp_webserver.py

#countcontent
1n/a#
2n/a# Example where a pool of http servers share a single listening socket
3n/a#
4n/a# On Windows this module depends on the ability to pickle a socket
5n/a# object so that the worker processes can inherit a copy of the server
6n/a# object. (We import `multiprocessing.reduction` to enable this pickling.)
7n/a#
8n/a# Not sure if we should synchronize access to `socket.accept()` method by
9n/a# using a process-shared lock -- does not seem to be necessary.
10n/a#
11n/a# Copyright (c) 2006-2008, R Oudkerk
12n/a# All rights reserved.
13n/a#
14n/a
15n/aimport os
16n/aimport sys
17n/a
18n/afrom multiprocessing import Process, current_process, freeze_support
19n/afrom http.server import HTTPServer
20n/afrom http.server import SimpleHTTPRequestHandler
21n/a
22n/aif sys.platform == 'win32':
23n/a import multiprocessing.reduction # make sockets pickable/inheritable
24n/a
25n/a
26n/adef note(format, *args):
27n/a sys.stderr.write('[%s]\t%s\n' % (current_process().name, format % args))
28n/a
29n/a
30n/aclass RequestHandler(SimpleHTTPRequestHandler):
31n/a # we override log_message() to show which process is handling the request
32n/a def log_message(self, format, *args):
33n/a note(format, *args)
34n/a
35n/adef serve_forever(server):
36n/a note('starting server')
37n/a try:
38n/a server.serve_forever()
39n/a except KeyboardInterrupt:
40n/a pass
41n/a
42n/a
43n/adef runpool(address, number_of_processes):
44n/a # create a single server object -- children will each inherit a copy
45n/a server = HTTPServer(address, RequestHandler)
46n/a
47n/a # create child processes to act as workers
48n/a for i in range(number_of_processes - 1):
49n/a Process(target=serve_forever, args=(server,)).start()
50n/a
51n/a # main process also acts as a worker
52n/a serve_forever(server)
53n/a
54n/a
55n/adef test():
56n/a DIR = os.path.join(os.path.dirname(__file__), '..')
57n/a ADDRESS = ('localhost', 8000)
58n/a NUMBER_OF_PROCESSES = 4
59n/a
60n/a print('Serving at http://%s:%d using %d worker processes' % \
61n/a (ADDRESS[0], ADDRESS[1], NUMBER_OF_PROCESSES))
62n/a print('To exit press Ctrl-' + ['C', 'Break'][sys.platform=='win32'])
63n/a
64n/a os.chdir(DIR)
65n/a runpool(ADDRESS, NUMBER_OF_PROCESSES)
66n/a
67n/a
68n/aif __name__ == '__main__':
69n/a freeze_support()
70n/a test()