Skip to content Skip to sidebar Skip to footer

Putting Models In A Callback Function From Ctypes Library

I am trying to setup an application based on the Google App Engine using the Managed VM feature. I am using a shared library written in C++ using ctypes cdll.LoadLibrary('./mylib.s

Solution 1:

I am only guessing what is my problem and i want to tell what i did to solve it.

The execution context of the callback functions is somewhat different than the rest of the python application. Any asynchronous operation in the callback fails. I tried doing an http call or saving it to the datastore. The operations never finish and after 60s the application shows an error that they crashed. I guess this is because how the python manages the execution and the corresponding memory allocation.

I was able to execute the callback in an object's context by wrapping it in a closure within a class. This wasnt really the problem but the solution can be found in this answer: How can I get methods to work as callbacks with python ctypes?

For my solution i am now using a combination of cloud-endpoints on another module and background threads on the ctypes-module.

Within the C-Callback i start a background thread, which is able to do asynchronous work

# Start abackground thread using the background thread service from GAE
background_thread.start_new_background_thread(putData, [name, value])

And here the simple task it executes:

# Here i call my cloud-endpointsdefputData(name, value):
    body = {
        'name' : 'name',
        'value' : int(value)
    }
    res = service.objects().create(body=body).execute()

Of course i need to do error handling and additional stuff, but for me this is a good solution.

Note: Adding models to the datastore in the bg thread failed because the environment in the bg thread is different from the application and the app id was not set.

Post a Comment for "Putting Models In A Callback Function From Ctypes Library"