forked from pauldardeau/python-concurrent-disk-io
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy paththreaded-simulated-disk-io-server.py
More file actions
82 lines (64 loc) · 2.29 KB
/
threaded-simulated-disk-io-server.py
File metadata and controls
82 lines (64 loc) · 2.29 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
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
# python - simulate occasional problematic (long blocking) requests within eventlet
# language version: 2.7
import eventlet
from eventlet.green import socket
import string
import time
from threading import Thread
READ_TIMEOUT_SECS = 4
STATUS_OK = 0
STATUS_QUEUE_TIMEOUT = 1
STATUS_BAD_INPUT = 2
def simulated_file_read(elapsed_time_ms):
time.sleep(elapsed_time_ms / 1000.0) # seconds
def handle_socket_request(sock, receipt_timestamp):
reader = sock.makefile('r')
writer = sock.makefile('w')
request_text = reader.readline()
if request_text:
start_processing_timestamp = time.time()
queue_time_ms = start_processing_timestamp - receipt_timestamp
queue_time_secs = queue_time_ms / 1000
rc = STATUS_OK
disk_read_time_ms = 0
file_path = ''
# has this request already timed out?
if queue_time_secs >= READ_TIMEOUT_SECS:
print("timeout (queue)")
rc = STATUS_QUEUE_TIMEOUT
else:
fields = string.split(request_text, ',')
if len(fields) == 3:
rc = int(fields[0])
disk_read_time_ms = long(fields[1])
file_path = fields[2]
Thread(target=lambda:
simulated_file_read(disk_read_time_ms)).start()
else:
rc = STATUS_BAD_INPUT
# total request time is sum of time spent in queue and the
# simulated disk read time
tot_request_time_ms = queue_time_ms + disk_read_time_ms
# construct response and send back to client
read_resp_text = "%d,%d,%s" % \
(rc, tot_request_time_ms, file_path)
writer.write(read_resp_text)
writer.flush()
reader.close()
writer.close()
sock.close()
def main(server_port):
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind(('', server_port))
server_socket.listen(100)
print("server listening on port %d" % server_port)
try:
while True:
sock, addr = server_socket.accept()
receipt_timestamp = time.time()
eventlet.spawn(handle_socket_request, sock, receipt_timestamp)
except KeyboardInterrupt:
pass # exit
if __name__=='__main__':
server_port = 7000
main(server_port)