Python GAE GCS write是否具有与NDB函数类似的异步版本
是否有像NDB函数一样的异步版本(例如,put\u async) 我发现(从appstats)由于我在代码中按顺序上传多个文件,这会耗费很多时间(所有文件都是按顺序上传的)。我试图减少这一时间,因为有六个文件,这是~7秒,我希望有更多的文件 我已将以下代码片段放入for循环中,该循环迭代用户在网页上选择的所有文件:Python GAE GCS write是否具有与NDB函数类似的异步版本,python,google-app-engine,asynchronous,google-cloud-storage,Python,Google App Engine,Asynchronous,Google Cloud Storage,是否有像NDB函数一样的异步版本(例如,put\u async) 我发现(从appstats)由于我在代码中按顺序上传多个文件,这会耗费很多时间(所有文件都是按顺序上传的)。我试图减少这一时间,因为有六个文件,这是~7秒,我希望有更多的文件 我已将以下代码片段放入for循环中,该循环迭代用户在网页上选择的所有文件: gcs_file = gcs.open (filename, 'w', content_type = 'image/jpeg') gcs_file.write (photo) g
gcs_file = gcs.open (filename, 'w', content_type = 'image/jpeg')
gcs_file.write (photo)
gcs_file.close ()
如果您需要更多数据,请告诉我
更新原始代码:
photo_blobkey_list = []
video_blobkey_list = []
i = 0
for photo in photo_list:
filename = bucket + "/user_pic_"+str (user_index) + "_" + str (i)
# Store the file in GCS
gcs_file = gcs.open (filename, 'w', content_type = 'image/jpeg')
gcs_file.write (photo)
gcs_file.close ()
# Store the GCS filename in Blobstore
blobstore_filename = '/gs' + filename
photo_blobkey = blobstore.create_gs_key (blobstore_filename)
photo_blobkey_list.append (photo_blobkey)
i = i + 1
i = 0
for video in video_list:
filename = bucket + "/user_video_"+str (user_index) + "_" + str (i)
filename = filename.replace (" ", "_")
# Store the file in GCS
gcs_file = gcs.open (filename, 'w', content_type = 'video/avi')
gcs_file.write (video)
gcs_file.close ()
# Store the GCS filename in Blobstore
blobstore_filename = '/gs' + filename
video_blobkey = blobstore.create_gs_key (blobstore_filename)
video_blobkey_list.append (video_blobkey)
i = i + 1
::
user_record.put ()
我的怀疑:基于这些建议,我计划将GCS编写部分放在一个tasklet子例程中,该子例程以文件名和照片/视频作为参数。如何在这里使用“yield”以使上述代码尽可能并行运行(所有照片和视频写入操作)?根据,我需要提供所有要产生的参数,以便使tasklet并行运行。但是,在我的例子中,上传的照片和视频的数量是可变的 相关文本: 如果这是两个独立的收益率报表,它们将在 系列但是产生一组微线程是一种并行的结果: 微线程可以并行运行,产量等待所有微线程的运行 完成并返回结果
有异步版本的
您可以使用它使用云存储或API将异步直接写入云存储。您可以在任务中执行写入操作 我想您会发现,您可以将其封装在Tasklet中,并获得异步行为。可以作为一个简单的tasklet(因为gcs会在引擎盖下使用urlfetch),也可以使用@ndb.synctasklet。请阅读ndb异步文档的后续部分(它对非ndb异步api有使用)@TimHoffman感谢您的回复。我会尝试使用tasklet和updateyou@TimHoffman我用更多的数据更新了我的问题。按照你和marcadian的建议,我计划使用微线程。我在我的岗位上对如何实施它有一些基本的疑问。请帮助澄清将gcs调用放置在
@ndb.tasklet
中是一个坏主意,因为死锁(很难在dev_appserver.py
上重现)。我们需要一种方法,通过RPC生成所有地面军事系统呼叫:3@gsinha你是从前端上传的吗?谢谢你的回复。您的解决方案看起来不错,但因为我已经以上面所示的方式使用了gcs库,所以我的第一选择是使用它(而不是迁移到JSON或XML格式)。如果我没有找到一个很好的解决方案,我会选择你的解决方案说明-如果你这样做的话,你将被收取所有的出站转帐费用(而不是使用GCS库,这将是免费的)。@JeffTratner否wont@StuartLangley这就是谷歌支持上周告诉我的;如果不是这样的话,那就太好了。@JeffTratner是谁支持你的?谢谢你的回答。我会尝试更新我的帖子,记住任务有100k的负载限制(对于push taskqueue),如果您的对象大于这个限制。您可以将对象放在数据存储中,并将密钥传递给任务。我已经用更多数据更新了我的问题。正如您和Tim Hoffman所建议的,我计划使用微线程。我在我的岗位上对如何实施它有一些基本的疑问。请帮助澄清