I rewrote the program to pass a class. Now I'm getting the following error:
Traceback (most recent call last):
File "client.py", line 25, in <module>
proc_res = stub.SquareProc(serverdata_pb2.client_class(class_str =
pick_sq))
File "/home/jatin/.local/lib/python3.8/site-packages/grpc/_channel.py",
line 826, in __call__
return _end_unary_response_blocking(state, call, False, None)
File "/home/jatin/.local/lib/python3.8/site-packages/grpc/_channel.py",
line 729, in _end_unary_response_blocking
raise _InactiveRpcError(state)
grpc._channel._InactiveRpcError: <_InactiveRpcError of RPC that terminated
with:
status = StatusCode.UNKNOWN
details = "Exception calling application: Can't get attribute 'Square_Loc'
on <module '__main__' from 'server.py'>"
debug_error_string =
"{"created":"@1601012690.097357367","description":"Error received from peer
ipv6:[::1]:50051","file":"src/core/lib/surface/call.cc","file_line":1061,"grpc_message":"Exception
calling application: Can't get attribute 'Square_Loc' on <module '__main__'
from 'server.py'>","grpc_status":2}"
So, Square_Loc is the class that I have defined in the client and sent to
the server. Can you suggest to me how I can debug this? Thanks
On Thu, Sep 24, 2020 at 12:17 PM Russell Wu <[email protected]> wrote:
> It seems to me that on the server when the `loads` trys to restore the
> Python object Get_Hash it cannot find it. Because for classes, pickle
> doesn't serialize its implementation but its import path (in this case
> `main.Get_Hash` if you run client.py directly). I suggest you put a
> try...except clause around the logic in Get_Data handler and print it
>
> On Thu, Sep 24, 2020 at 2:00 PM Jatin Sharma <[email protected]> wrote:
>
>> Hi Russell,
>> Please find below the code for server.
>>
>> import grpc
>> from concurrent import futures
>> import time
>> import pickle
>>
>> import pandas as pd
>> import serverdata_pb2
>> import serverdata_pb2_grpc
>>
>> def get_df():
>> cars = {'Brand': ['Honda Civic','Toyota Corolla','Ford Focus','Audi
>> A4'],
>> 'Price': [22000,25000,27000,35000]
>> }
>>
>> df = pd.DataFrame(cars, columns = ['Brand', 'Price'])
>> return df
>>
>> class DataProviderServicer(serverdata_pb2_grpc.DataProviderServicer):
>> def Get_Data(self,request,context):
>> get_func = pickle.loads(request.client_class)
>> a = get_func()
>> df = get_df()
>> ans = a.get_hash(df)
>> response = serverdata_pb2.result()
>> response.result = ans
>> return response
>>
>> server = grpc.server(futures.ThreadPoolExecutor(max_workers=10))
>>
>> serverdata_pb2_grpc.add_DataProviderServicer_to_server(
>> DataProviderServicer(), server)
>>
>> print('Starting server. Listening on port 50051.')
>> server.add_insecure_port('[::]:50051')
>> server.start()
>>
>> try:
>> while True:
>> time.sleep(86400)
>> except KeyboardInterrupt:
>> server.stop(0)
>>
>> On Thu, Sep 24, 2020 at 9:04 AM Russell Wu <[email protected]> wrote:
>>
>>> Please also post the log on the server side. It does look like some
>>> error happened in Get_Data handler on the server. Maybe mismatch of
>>> generated client_class code between client and server?
>>>
>>> On Thu, Sep 24, 2020 at 11:11 AM Jatin Sharma <[email protected]>
>>> wrote:
>>>
>>>> I don't understand the handle terminology. Can you please explain what
>>>> you mean by handle. Thanks.
>>>>
>>>> On Wednesday, September 23, 2020 at 11:08:35 PM UTC+5:30
>>>> [email protected] wrote:
>>>>
>>>>> I would expect there to be more to the error message than just
>>>>> "client_class". I'm assuming there's an indentation problem in your
>>>>> original post and that the instantiation of the "client_class" message is
>>>>> happening within the Get_Data handler. What happens if you try to
>>>>> instantiate a "client_class" outside of the handler, on the main thread.
>>>>> Do
>>>>> you get a more illuminating error message?
>>>>> On Wednesday, September 23, 2020 at 9:20:45 AM UTC-4 Jatin Sharma
>>>>> wrote:
>>>>>
>>>>>> I want to send a class to the grpc server. So, I am pickling the
>>>>>> class and sharing as a bytes format in the message.
>>>>>> The .proto file(serverdata.proto) looks like below:
>>>>>>
>>>>>> syntax = "proto3";
>>>>>>
>>>>>> service DataProvider{
>>>>>> rpc Get_Data(client_class) returns (result);
>>>>>> }
>>>>>>
>>>>>> message client_class{
>>>>>> bytes class_str = 1;
>>>>>> }
>>>>>>
>>>>>> message result{
>>>>>> int64 res = 1;
>>>>>> }
>>>>>>
>>>>>> client.py file looks like below:
>>>>>>
>>>>>> import grpc
>>>>>> import serverdata_pb2
>>>>>> import serverdata_pb2_grpc
>>>>>> import pickle
>>>>>> import pandas as pd
>>>>>>
>>>>>>
>>>>>> class Get_Hash():
>>>>>> def get_hash(self,df):
>>>>>> return pd.util.hash_pandas_object(df).sum()
>>>>>>
>>>>>> a = serverdata_pb2.client_class()
>>>>>> a.class_str = pickle.dumps(Get_Hash)
>>>>>>
>>>>>> channel = grpc.insecure_channel('localhost:50051')
>>>>>> # create a stub (client)
>>>>>> stub = serverdata_pb2_grpc.DataProviderStub(channel)
>>>>>> response = stub.Get_Data(a)
>>>>>>
>>>>>> print(response.res)
>>>>>>
>>>>>> On running this client, I'm getting the following error:
>>>>>>
>>>>>> Traceback (most recent call last):
>>>>>> File "client.py", line 18, in <module>
>>>>>> response = stub.Get_Data(a)
>>>>>> File
>>>>>> "/home/jatin/.local/lib/python3.8/site-packages/grpc/_channel.py", line
>>>>>> 826, in __call__
>>>>>> return _end_unary_response_blocking(state, call, False, None)
>>>>>> File
>>>>>> "/home/jatin/.local/lib/python3.8/site-packages/grpc/_channel.py", line
>>>>>> 729, in _end_unary_response_blocking
>>>>>> raise _InactiveRpcError(state)
>>>>>> grpc._channel._InactiveRpcError: <_InactiveRpcError of RPC that
>>>>>> terminated with:
>>>>>> status = StatusCode.UNKNOWN
>>>>>> details = "Exception calling application: client_class"
>>>>>> debug_error_string =
>>>>>> "{"created":"@1600867086.557068214","description":"Error received from
>>>>>> peer
>>>>>> ipv6:[::1]:50051","file":"src/core/lib/surface/call.cc","file_line":1061,"grpc_message":"Exception
>>>>>> calling application: client_class","grpc_status":2}"
>>>>>> >
>>>>>>
>>>>>> I'm unable to resolve this error. I checked the type of the pickle
>>>>>> file. It was 'bytes'. So, I changed the type in the .proto file to bytes.
>>>>>> I'd be grateful if someone can help me resolve this error.
>>>>>>
>>>>>> Regards,
>>>>>> Jatin
>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>> --
>>>> You received this message because you are subscribed to the Google
>>>> Groups "grpc.io" group.
>>>> To unsubscribe from this group and stop receiving emails from it, send
>>>> an email to [email protected].
>>>> To view this discussion on the web visit
>>>> https://groups.google.com/d/msgid/grpc-io/65656b59-cc4d-40d7-a00f-eef9b8f785ecn%40googlegroups.com
>>>> <https://groups.google.com/d/msgid/grpc-io/65656b59-cc4d-40d7-a00f-eef9b8f785ecn%40googlegroups.com?utm_medium=email&utm_source=footer>
>>>> .
>>>>
>>>
--
You received this message because you are subscribed to the Google Groups
"grpc.io" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/grpc-io/CAHsNn%2B%3Doz%3DfGMDz46NiKiwtJ2g9Q8YG16gR3Em4Q4wGA8%3DVS7w%40mail.gmail.com.