forked from doctaphred/phrecipes
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathzmqrpc.py
56 lines (47 loc) · 1.72 KB
/
zmqrpc.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
import traceback
from datetime import datetime
from itertools import count
import zmq
def serve(procs, port=None, addr='tcp://*', context=None, debug=False):
"""Make some procedures available for remote calls via ØMQ."""
if context is None:
context = zmq.Context.instance()
with context.socket(zmq.REP) as socket:
if port is None:
port = socket.bind_to_random_port(addr)
else:
socket.bind('{}:{}'.format(addr, port))
print('Serving at {}:{}'.format(addr, port))
print('sending and receiving JSON')
for i in count(1):
idle = datetime.now()
print('{}: waiting for request #{}...'.format(idle, i))
message = socket.poll()
start = datetime.now()
print('{}: received request #{} after {}'
.format(start, i, start - idle))
try:
request = socket.recv_json()
name, *args = request
result = procs[name](*args)
reply = {'result': result}
print(reply)
socket.send_json(reply)
except Exception as exc:
if debug:
traceback.print_exc()
message = '{}: {}'.format(exc.__class__.__name__, exc)
reply = {'error': message}
print(reply)
socket.send_json(reply)
end = datetime.now()
print('{}: replied to #{} after {}'
.format(end, i, end - start))
if __name__ == '__main__':
data = {}
procs = {
'GET': data.__getitem__,
'SET': data.__setitem__,
'DEL': data.__delitem__,
}
serve(procs, 6379) # Look Ma, Redis!