7
7
import numbers
8
8
import pickle
9
9
from functools import partial
10
- from typing import Generator
11
-
12
10
import grpc
13
11
import numpy as np
14
12
@@ -50,11 +48,14 @@ def __init__(self, server_address: str, debug=False):
50
48
if debug :
51
49
logger .setLevel (logging .DEBUG )
52
50
self .server_address = server_address
53
- self .channel = grpc .insecure_channel (server_address ,
54
- options = [('grpc.max_send_message_length' , MAX_MESSAGE_LENGTH ),
55
- ('grpc.max_receive_message_length' , MAX_MESSAGE_LENGTH ),
56
- ('grpc.max_metadata_size' , MAX_METADATA_SIZE )]
57
- )
51
+ self .channel = grpc .insecure_channel (
52
+ server_address ,
53
+ options = [
54
+ ("grpc.max_send_message_length" , MAX_MESSAGE_LENGTH ),
55
+ ("grpc.max_receive_message_length" , MAX_MESSAGE_LENGTH ),
56
+ ("grpc.max_metadata_size" , MAX_METADATA_SIZE ),
57
+ ],
58
+ )
58
59
59
60
def register (self , func = None , stream = False ):
60
61
"""
@@ -63,54 +64,69 @@ def register(self, func=None, stream=False):
63
64
stream(bool): use stream mode
64
65
:return:
65
66
"""
67
+
66
68
# if return_type not in self.__type:
67
69
# raise ValueError(f"TZRPC return type only support {self.__type}")
68
70
def decorate (_func ):
69
71
return partial (wrapper , _func )
70
72
71
73
def wrapper (_func , * args , ** kwargs ):
72
74
stub = toObjectStub (self .channel , _func .__name__ )
75
+ # logger.debug(f"{self.channel._channel.name}-{_func.__name__}")
73
76
result = _func (* args , ** kwargs )
74
- if isinstance (result , str ):
75
- request = String (text = result )
76
- response = stub .toString (request ).text
77
+ if not stream :
78
+ if isinstance (result , str ):
79
+ request = String (text = result )
80
+ response = stub .toString (request ).text
77
81
78
- elif isinstance (result , np .ndarray ):
79
- request = numpy2protobuf (result )
80
- response = protobuf2numpy (stub .toNdarray (request ))
81
- elif isinstance (result , bytes ):
82
- request = Bytes (data = result )
83
- response = stub .toBytes (request ).data
84
- elif isinstance (result , bool ):
85
- request = Boolean (value = result )
86
- response = bool (stub .toBoolean (request ).value )
87
- elif isinstance (result , numbers .Number ):
88
- if isinstance (result , int ):
89
- request = Integer (value = result )
90
- response = stub .toInteger (request ).value
91
- elif isinstance (result , float ):
92
- request = Double (value = result )
93
- response = stub .toDouble (request ).value
82
+ elif isinstance (result , np .ndarray ):
83
+ request = numpy2protobuf (result )
84
+ response = protobuf2numpy (stub .toNdarray (request ))
85
+ elif isinstance (result , bytes ):
86
+ request = Bytes (data = result )
87
+ response = stub .toBytes (request ).data
88
+ elif isinstance (result , bool ):
89
+ request = Boolean (value = result )
90
+ response = bool (stub .toBoolean (request ).value )
91
+ elif isinstance (result , numbers .Number ):
92
+ if isinstance (result , int ):
93
+ request = Integer (value = result )
94
+ response = stub .toInteger (request ).value
95
+ elif isinstance (result , float ):
96
+ request = Double (value = result )
97
+ response = stub .toDouble (request ).value
98
+ else :
99
+ logger .exception (f"Type of { type (result )} is not support" )
100
+ elif self .tensor_type is not None and isinstance (
101
+ result , self .tensor_type
102
+ ):
103
+ request = numpy2protobuf (result .numpy ())
104
+ response = torch .from_numpy (
105
+ protobuf2numpy (stub .toNdarray (request )).copy ()
106
+ )
94
107
else :
95
- logger .exception (f"Type of { type (result )} is not support" )
96
- elif self .tensor_type is not None and isinstance (result , self .tensor_type ):
97
- request = numpy2protobuf (result .numpy ())
98
- response = torch .from_numpy (
99
- protobuf2numpy (stub .toNdarray (request )).copy ()
100
- )
101
- else :
102
- logger .info (f"Data will serialized by pickle and send with bytes" )
103
- obj = pickle .dumps (result )
104
- if stream :
105
- request = Bytes (data = b"STREAM" + obj )
106
- response = stub .toBytesStream (request )
107
- else :
108
- request = Bytes (data = b"PICKLE" + obj )
108
+ logger .info ("Data will serialized by pickle and send with bytes" )
109
+ obj = pickle .dumps (result )
110
+ request = Bytes (data = b"PICKLE" + obj )
109
111
response = pickle .loads (stub .toBytes (request ).data )
112
+ logger .debug (f"type of data loaded is { type (response )} " )
113
+ return response
114
+ else :
115
+
116
+ def pack (data ):
117
+ for i in data :
118
+ _obj = pickle .dumps (i )
119
+ yield Bytes (data = b"PICKLE" + _obj )
110
120
111
- logger .debug (f"type of data loaded is { type (response )} " )
121
+ def unpack (data ):
122
+ for i in data :
123
+ _data = i .data
124
+ is_pickled = True if b"PICKLE" in _data [:6 ] else False
125
+ if is_pickled :
126
+ _data = pickle .loads (_data [6 :])
127
+ yield _data
112
128
113
- return response
129
+ return unpack ( stub . toBytesStream ( pack ( result )))
114
130
115
131
if func is not None :
116
132
return partial (wrapper , func )
0 commit comments