Hi Russell,
It worked.
However, I believe this may not be the solution that I am looking for. The
idea that I'm trying to apply is that when the server contains a
database/pandas and the client sends a request to the server. The request
includes the function that needs to operate on the database.

In the suggested solution, I have to make the class available on the
server. If I have to make the class available on the server, it beats the
purpose of using a client to send the pickled procedure. Is there a
workaround such that I will not have to make the class available on the
server?

On Fri, Sep 25, 2020 at 11:41 AM Russell Wu <[email protected]> wrote:

> You will need to put your Square_Loc in a shared module, whose import path
> must be identical to your client and server, for example:
>
> ```
> # in client.py
> from .loc import Square_Loc
>
> # in server.py
> from .loc import Square_Loc
> ```
>
>
>
> On Fri, Sep 25, 2020 at 2:00 PM Jatin Sharma <[email protected]> wrote:
>
>> 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%3DfS%2BmDCPKpskwPcBY32Sp_CxXYYCZAe-%2BmdyjrNuBmyw%40mail.gmail.com.

Reply via email to