14 """The Python AsyncIO implementation of the gRPC route guide server."""
20 from typing
import AsyncIterable, Iterable
23 import route_guide_pb2
24 import route_guide_pb2_grpc
25 import route_guide_resources
28 def get_feature(feature_db: Iterable[route_guide_pb2.Feature],
29 point: route_guide_pb2.Point) -> route_guide_pb2.Feature:
30 """Returns Feature at given location or None."""
31 for feature
in feature_db:
32 if feature.location == point:
38 end: route_guide_pb2.Point) -> float:
39 """Distance between two points."""
40 coord_factor = 10000000.0
41 lat_1 = start.latitude / coord_factor
42 lat_2 = end.latitude / coord_factor
43 lon_1 = start.longitude / coord_factor
44 lon_2 = end.longitude / coord_factor
45 lat_rad_1 = math.radians(lat_1)
46 lat_rad_2 = math.radians(lat_2)
47 delta_lat_rad = math.radians(lat_2 - lat_1)
48 delta_lon_rad = math.radians(lon_2 - lon_1)
51 a = (pow(math.sin(delta_lat_rad / 2), 2) +
52 (math.cos(lat_rad_1) * math.cos(lat_rad_2) *
53 pow(math.sin(delta_lon_rad / 2), 2)))
54 c = 2 * math.atan2(math.sqrt(a), math.sqrt(1 - a))
61 """Provides methods that implement functionality of route guide server."""
67 unused_context) -> route_guide_pb2.Feature:
75 self, request: route_guide_pb2.Rectangle,
76 unused_context) -> AsyncIterable[route_guide_pb2.Feature]:
77 left =
min(request.lo.longitude, request.hi.longitude)
78 right =
max(request.lo.longitude, request.hi.longitude)
79 top =
max(request.lo.latitude, request.hi.latitude)
80 bottom =
min(request.lo.latitude, request.hi.latitude)
81 for feature
in self.
db:
82 if (feature.location.longitude >= left
and
83 feature.location.longitude <= right
and
84 feature.location.latitude >= bottom
and
85 feature.location.latitude <= top):
89 route_guide_pb2.Point], unused_context) -> route_guide_pb2.RouteSummary:
95 start_time = time.time()
96 async
for point
in request_iterator:
104 elapsed_time = time.time() - start_time
106 feature_count=feature_count,
107 distance=
int(distance),
108 elapsed_time=
int(elapsed_time))
111 self, request_iterator: AsyncIterable[route_guide_pb2.RouteNote],
112 unused_context) -> AsyncIterable[route_guide_pb2.RouteNote]:
114 async
for new_note
in request_iterator:
115 for prev_note
in prev_notes:
116 if prev_note.location == new_note.location:
118 prev_notes.append(new_note)
122 server = grpc.aio.server()
125 server.add_insecure_port(
'[::]:50051')
127 await server.wait_for_termination()
130 if __name__ ==
'__main__':
131 logging.basicConfig(level=logging.INFO)
132 asyncio.get_event_loop().run_until_complete(
serve())