首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将模型放入ctype库中的回调函数中

将模型放入ctype库中的回调函数中
EN

Stack Overflow用户
提问于 2015-04-22 11:01:04
回答 1查看 352关注 0票数 0

我正在尝试使用托管VM功能建立一个基于Google的应用程序。

我使用一个用C++编写的共享库,它使用ctype

代码语言:javascript
复制
cdll.LoadLibrary('./mylib.so')

,它注册回调函数。

代码语言:javascript
复制
CB_FUNC_TYPE = CFUNCTYPE(None, eSubscriptionType)
cbFuncType = CB_FUNC_TYPE(scrptCallbackHandler)

,其中我希望将数据保存到ndb数据存储中。

代码语言:javascript
复制
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处理程序的上下文似乎丢失了。这里的解决方案很可能是以某种方式创建应用程序上下文。

EN

回答 1

Stack Overflow用户

发布于 2015-04-23 11:04:07

我只是猜测我的问题是什么,我想告诉你我做了什么来解决它。

回调函数的执行上下文与python应用程序的其他部分有些不同。回调中的任何异步操作都会失败。我试着做一个http调用或者将它保存到数据存储。这些操作从未完成,60年代以后,应用程序显示了一个错误,它们崩溃了。我猜这是因为python如何管理执行和相应的内存分配。

我能够在对象的上下文中执行回调,方法是将回调封装在类中的闭包中。这并不是真正的问题,但在这个答案中可以找到解决方案:How can I get methods to work as callbacks with python ctypes?

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

在C-回调中,我启动了一个后台线程,它能够执行异步工作。

代码语言:javascript
复制
# Start a background thread using the background thread service from GAE
background_thread.start_new_background_thread(putData, [name, value])

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

代码语言:javascript
复制
# 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。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29795454

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档