-
Notifications
You must be signed in to change notification settings - Fork 23
Expand file tree
/
Copy path07_webserver.py
More file actions
53 lines (40 loc) · 1.56 KB
/
07_webserver.py
File metadata and controls
53 lines (40 loc) · 1.56 KB
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
import asyncio
from http.server import BaseHTTPRequestHandler, ThreadingHTTPServer
from apify import Actor
processed_items = 0
http_server = None
# Just a simple handler that will print the number of processed items so far
# on every GET request.
class RequestHandler(BaseHTTPRequestHandler):
def do_get(self) -> None:
self.log_request()
self.send_response(200)
self.end_headers()
self.wfile.write(bytes(f'Processed items: {processed_items}', encoding='utf-8'))
def run_server() -> None:
# Start the HTTP server on the provided port,
# and save a reference to the server.
global http_server
with ThreadingHTTPServer(
('', Actor.configuration.web_server_port), RequestHandler
) as server:
Actor.log.info(f'Server running on {Actor.configuration.web_server_port}')
http_server = server
server.serve_forever()
async def main() -> None:
global processed_items
async with Actor:
# Start the HTTP server in a separate thread.
run_server_task = asyncio.get_running_loop().run_in_executor(None, run_server)
# Simulate doing some work.
for _ in range(100):
await asyncio.sleep(1)
processed_items += 1
Actor.log.info(f'Processed items: {processed_items}')
if http_server is None:
raise RuntimeError('HTTP server not started')
# Signal the HTTP server to shut down, and wait for it to finish.
http_server.shutdown()
await run_server_task
if __name__ == '__main__':
asyncio.run(main())