把模型的回调函数从ctypes的图书馆(Putting models in a callback f

2019-11-03 18:32发布

我试图建立基于谷歌应用程序引擎使用VM管理功能的应用程序。

我使用C语言编写的共享库++使用ctypes的

cdll.LoadLibrary('./mylib.so')

一个注册到回调函数

CB_FUNC_TYPE = CFUNCTYPE(None, eSubscriptionType)
cbFuncType = CB_FUNC_TYPE(scrptCallbackHandler)

在这我想将数据保存到数据存储NDB

def scrptCallbackHandler(arg):
    model = Model(name=str(arg.data))
    model.put()

我注册中,我想借此从C ++程序中的数据,并把它的数据存储NDB一个回调函数。 这将导致一个错误。 在devserver它的表现略有不同,从生产服务器这样:

suspended generator _put_tasklet(context.py:343) raised BadRequestError(Application Id (app) format is invalid: '_')LOG 2 1429698464071045 suspended generator put(context.py:810) raised BadRequestError(Application Id (app) format is invalid: '_') Traceback (most recent call last): File "_ctypes/callbacks.c", line 314, in 'calling callback function' File "/home/vmagent/app/isw_cloud_client.py", line 343, in scrptCallbackHandler node.put() File "/home/vmagent/python_vm_runtime/google/appengine/ext/ndb/model.py", line 3380, in _put return self._put_async(**ctx_options).get_result() File "/home/vmagent/python_vm_runtime/google/appengine/ext/ndb/tasklets.py", line 325, in get_result self.check_success() File "/home/vmagent/python_vm_runtime/google/appengine/ext/ndb/tasklets.py", line 368, in _help_tasklet_along value = gen.throw(exc.__class__, exc, tb) File "/home/vmagent/python_vm_runtime/google/appengine/ext/ndb/context.py", line 810, in put key = yield self._put_batcher.add(entity, options) File "/home/vmagent/python_vm_runtime/google/appengine/ext/ndb/tasklets.py", line 368, in _help_tasklet_along value = gen.throw(exc.__class__, exc, tb) File "/home/vmagent/python_vm_runtime/google/appengine/ext/ndb/context.py", line 343, in _put_tasklet keys = yield self._conn.async_put(options, datastore_entities) File "/home/vmagent/python_vm_runtime/google/appengine/ext/ndb/tasklets.py", line 454, in _on_rpc_completion result = rpc.get_result() File "/home/vmagent/python_vm_runtime/google/appengine/api/apiproxy_stub_map.py", line 613, in get_result return self.__get_result_hook(self) File "/home/vmagent/python_vm_runtime/google/appengine/datastore/datastore_rpc.py", line 1827, in __put_hook self.check_rpc_success(rpc) File "/home/vmagent/python_vm_runtime/google/appengine/datastore/datastore_rpc.py", line 1342, in check_rpc_success raise _ToDatastoreError(err)google.appengine.api.datastore_errors.BadRequestError: Application Id (app) format is invalid: '_'

该C ++程序的开始是由于请求处理程序的调用触发但在后台运行并接受应在回调处理输入数据。

更新:作为添指出,已经似乎WSGI处理程序的上下文丢失。 最有可能这里的解决办法是莫名其妙地创建应用程序上下文。

Answer 1:

我只是猜测什么是我的问题,我想告诉我的所作所为来解决它。

的回调函数的执行上下文比蟒应用程序的其余有些不同。 在回调的任何异步操作失败。 我试图做一个HTTP调用或将其保存到数据存储。 该操作永远不会完成,60年代后的应用表明,他们崩溃的错误。 我想这是因为如何蟒蛇管理执行和相应的内存分配。

我能够在一个类中的一个封闭包装它来执行在对象的上下文中的回调。 这真的wasnt的问题,但解决方案可以在这个答案中找到: 我怎样才能获得方法与蟒蛇的ctypes回调的工作?

对于我的解决方案我现在用的ctypes的模块上的另一模块和后台线程云终端的组合。

内的C-回调我开始一个后台线程,这是能够做到的异步工作

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

在这里简单的任务,它执行:

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

当然,我需要做的错误处理和额外的东西,但对我来说这是一个很好的解决方案。

注意:添加模型在BG线程的数据存储失败,因为在BG线程环境是从应用程序的不同,并没有设置应用程序ID。



文章来源: Putting models in a callback function from ctypes library