我在使用Google App Engine Background Threads中的Managed VM时出现问题。
我正在从通过Ctypes链接的库中获取回调,这些回调需要在后台执行,正如我在previous question中解释的那样。
问题是:应用程序丢失了它的执行上下文(wsgi应用程序),并且缺少像Application id这样的环境变量。没有那些我无法在数据库失败时调用它们。
我将后台话题称为
background_thread.start_new_background_thread(saveItemsToDatabase, [])
有没有办法将环境复制到后台线程,或者可能在不同的上下文中执行任务?
更新:回溯使得它已经清楚问题是什么:
_ToDatastoreError(err)google.appengine.api.datastore_errors.BadRequestError: Application Id (app) format is invalid: '_'
答案 0 :(得分:1)
应用程序上下文是appengine中的线程本地。请记住,启用线程的python27中的appengine中的应用程序已经有线程。因此,每个wsgi调用然后环境变量必须是线程本地的,否则信息将在处理的请求之间泄漏。
这意味着您创建的其他线程需要显式传递应用程序上下文。
事实上当你开始阅读后台线程上的文档时,很明显发生了什么,https://cloud.google.com/appengine/docs/python/modules/#Python_Background_threads - 后台线程的os.environ和日志记录条目独立于产生线程的那些强>
所以你必须复制env(os.environ)或你需要的部分,并将它作为参数传递给线程。问题可能不仅限于 appid 您可能会发现这只是第一件事。例如,如果您使用名称空间。