Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/google-app-engine/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将模型放入ctypes库的回调函数中_Python_Google App Engine_Google Cloud Datastore_App Engine Ndb_App Engine Flexible - Fatal编程技术网

Python 将模型放入ctypes库的回调函数中

Python 将模型放入ctypes库的回调函数中,python,google-app-engine,google-cloud-datastore,app-engine-ndb,app-engine-flexible,Python,Google App Engine,Google Cloud Datastore,App Engine Ndb,App Engine Flexible,我正在尝试使用托管VM功能基于Google应用程序引擎设置应用程序 我使用C++类型的共享库使用cType cdll.LoadLibrary('./mylib.so') 它注册了一个回调函数 CB_FUNC_TYPE = CFUNCTYPE(None, eSubscriptionType) cbFuncType = CB_FUNC_TYPE(scrptCallbackHandler) 我想在其中将数据保存到ndb数据存储 def scrptCallbackHandler(arg):

我正在尝试使用托管VM功能基于Google应用程序引擎设置应用程序

我使用C++类型的共享库使用cType

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\u put\u tasklet(context.py:343)引发的BadRequestError(应用程序Id(app)格式无效:“"”)日志1429698464071045 suspended generator put(context.py:810)引发的BadRequestError(应用程序Id(app)格式无效:“"”
回溯(最近一次呼叫最后一次):
“调用回调函数”文件“/home/vmagent/app/isw_cloud_client.py”第343行scrptCallbackHandler node.put()中的第314行文件“_ctypes/callbacks.c”
文件“/home/vmagent/python_vm_runtime/google/appengine/ext/ndb/model.py”,第3380行,在_putreturn self._put_async(**ctx_options).get_result()中
文件“/home/vmagent/python_vm_runtime/google/appengine/ext/ndb/tasklets.py”,第325行,在get_result self.check_success()中
文件“/home/vmagent/python\u vm\u runtime/google/appengine/ext/ndb/tasklets.py”,第368行,在_help\u tasklet\u-along value=gen.throw中(exc.u类,exc,tb)
文件“/home/vmagent/python\u vm\u runtime/google/appengine/ext/ndb/context.py”,第810行,在put key=yield self.\u put\u batcher.add(实体,选项)
文件“/home/vmagent/python\u vm\u runtime/google/appengine/ext/ndb/tasklets.py”,第368行,在_help\u tasklet\u-along value=gen.throw中(exc.u类,exc,tb)
文件“/home/vmagent/python\u vm\u runtime/google/appengine/ext/ndb/context.py”,第343行,in\u put\u tasklet key=yield self.\u conn.async\u put(选项、数据存储实体)
文件“/home/vmagent/python_vm_runtime/google/appengine/ext/ndb/tasklets.py”,第454行,在_on_rpc_completion result=rpc.get_result()中
文件“/home/vmagent/python_vm_runtime/google/appengine/api/apiproxy_stub_map.py”,第613行,在获取结果返回self中
文件“/home/vmagent/python_-vm_-runtime/google/appengine/datastore/datastore_-rpc.py”,第1827行,在u-put_-hook-self.check_-rpc_-success(rpc)中
文件“/home/vmagent/python\u vm\u runtime/google/appengine/datastore/datastore\u rpc.py”,第1342行,在check\u rpc\u success raise\u ToDatastoreError(err)google.appengine.api.datastore\u errors.BadRequestError:Application Id(app)格式无效:'.

< > C++程序的启动是通过对请求处理程序的调用来触发的,但在后台运行,并接受回调中应该处理的传入数据。
更新:正如Tim已经指出的,wsgi处理程序的上下文似乎丢失了。这里最有可能的解决方案是以某种方式创建应用程序上下文。

我只是在猜测我的问题是什么,我想告诉大家我是如何解决的

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

我能够在对象的上下文中执行回调,方法是将其包装在类中的闭包中。这不是真正的问题,但可以从以下答案中找到解决方案:

对于我的解决方案,我现在使用另一个模块上的云端点和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。

大部分答案都是stacktrace-'(应用程序id(应用程序)格式无效:'\u')'构造键时,其中一个元素是应用程序id。我猜在回调上下文中,wsgi处理程序设置的环境不再存在。在回调中记录env,并在运行ctypes代码之前进行比较。在调用ctypes之前,看看是否可以将内容放入线程本地存储,并看看在回调中是否可以检索到这些内容。我有一种感觉,因为数据存储库libs的工作方式,所以您试图做的不会起作用。我认为您将我带到了正确的轨道,在
os.environ
中没有任何内容,我认为我必须以某种方式创建上下文。