Javascript 谷歌云功能、谷歌计算引擎和排队请求

Javascript 谷歌云功能、谷歌计算引擎和排队请求,javascript,python,google-cloud-functions,google-compute-engine,Javascript,Python,Google Cloud Functions,Google Compute Engine,我有一个启动计算引擎实例的云函数。但是,当触发多个函数时,在计算引擎上运行的先前操作会被传入的函数/命令中断。计算引擎正在运行pytorch实现。。。是否有一种方法可以将这些传入函数发送到队列,以便在关闭机器之前,在计算机引擎上运行的当前操作在接收下一个传入操作之前完成?任何概念性指导都将不胜感激 编辑 我的功能在存储桶更改时触发(上传)。在函数中,我启动一个GCE实例,并使用如下启动脚本自定义其启动行为(为简洁起见,简化了一些命令和目录): 将多个批上载到云存储时会出现问题。每个新功能都将使用

我有一个启动计算引擎实例的云函数。但是,当触发多个函数时,在计算引擎上运行的先前操作会被传入的函数/命令中断。计算引擎正在运行pytorch实现。。。是否有一种方法可以将这些传入函数发送到队列,以便在关闭机器之前,在计算机引擎上运行的当前操作在接收下一个传入操作之前完成?任何概念性指导都将不胜感激

编辑

我的功能在存储桶更改时触发(上传)。在函数中,我启动一个GCE实例,并使用如下启动脚本自定义其启动行为(为简洁起见,简化了一些命令和目录):


将多个批上载到云存储时会出现问题。每个新功能都将使用新的启动脚本重新启动GCE实例,并开始处理新数据,保留以前的数据未完成。

云任务确实满足您的要求,云任务允许您分离出可以在主应用程序流之外独立执行的工作,并使用您创建的处理程序异步发送它们以进行处理。如果您有更多关于将云任务调整到当前系统结构的问题,请告诉我

因为您的GCE实例是由云功能创建的。云任务可以通过其具有公共IP地址的HTTP端点调用云函数。因此,云任务是HTTP目标。您可以按照说明和示例代码进行操作


此外,GCP提供的教程完全相同,系统设计完全符合您当前的要求。

云任务确实满足您的要求,云任务允许您分离出可以在主应用程序流之外独立执行的工作,并将其发送到异步处理,使用您创建的处理程序。如果您有更多关于将云任务调整到当前系统结构的问题,请告诉我

因为您的GCE实例是由云功能创建的。云任务可以通过其具有公共IP地址的HTTP端点调用云函数。因此,云任务是HTTP目标。您可以按照说明和示例代码进行操作


此外,GCP提供的教程完全相同,系统设计完全符合您当前的要求。

确实满足您的要求,云任务允许您分离出可以在主应用程序流之外独立执行的工作,并将其发送到异步处理,使用您创建的处理程序。如果您有更多关于将云任务调整到当前系统结构的问题,请告诉我,您在计算引擎上做了多少次pytorch工作?@ShawnDiWu这听起来正是我需要的!该链接更多地讨论了将云任务与应用程序引擎而不是计算引擎集成,但如果我可以将其与计算引擎集成,那么我将继续使用它新创建的GCE实例是否具有相同的配置?有什么区别吗?实际上,云任务满足了您的需求,它允许您分离出可以在主应用程序流之外独立执行的工作,并使用您创建的处理程序将它们发送给异步处理。如果您有更多关于将云任务调整到当前系统结构的问题,请告诉我,您在计算引擎上做了多少次pytorch工作?@ShawnDiWu这听起来正是我需要的!该链接更多地讨论了将云任务与应用程序引擎而不是计算引擎集成,但如果我可以将其与计算引擎集成,那么我将继续使用它新创建的GCE实例是否具有相同的配置?有什么不同吗?云函数包含启动GCE的启动脚本。启动脚本中唯一的区别是实例运行后执行的程序上的标志。我将编辑我的问题以显示云功能。你能向我解释一下为什么你要实现bash来上传到GCS bucket吗?看起来你在这个功能中捆绑了很多任务,所以机器从一个GCS存储桶中提取文件,分析它们,然后输出到另一个存储桶。VM在使用时启动和停止,以避免产生额外的不必要成本,因此在VM启动时,必须重新初始化设置。我负责在启动时自动配置VM,在云函数中设置启动脚本似乎是实现这一点并在VM启动后传递python程序所需变量的最简单方法。我正在阅读文档,很难弄清楚如何创建一个队列来接收来自云函数的事件。另外,我不明白GCE在关闭之前将如何处理这些事件。云函数包含启动GCE的启动脚本。启动脚本中唯一的区别是实例运行后执行的程序上的标志。我将编辑我的问题以显示云功能。你能向我解释一下为什么你要实现bash来上传到GCS bucket吗?看起来你在这个功能中捆绑了很多任务,所以机器从一个GCS存储桶中提取文件,分析它们,然后输出到另一个存储桶。VM在使用时启动和停止,以避免产生额外的不必要成本,因此在VM启动时,必须重新初始化设置。我负责在启动时自动配置VM,在云函数中设置启动脚本似乎是实现这一点并在VM启动后传递python程序所需变量的最简单方法。我正在阅读文档,很难弄清楚如何创建一个队列来接收来自云函数的事件。而且,我不是
import os
from googleapiclient.discovery import build


def start(event, context):
    file = event
    print(file["id"])

    string = file["id"]

    newstring = string.split('/')
    userId = newstring[1]
    paymentId = newstring[2]
    name = newstring[3]

    print(name)

    if name == "uploadcomplete.txt":
        startup_script = """#! /bin/bash
                cd ~ && pwd 1>>/var/log/log.out 2>&1
                PATH=$PATH://usr/local/cuda 1>>/var/log/log.out 2>&1
                cd program_directory 1>>/var/log/log.out 2>&1
                source /opt/anaconda3/etc/profile.d/conda.sh 1>/var/log/log.out 2>&1
                conda activate env
                cd keras-retinanet/ 1>>/var/log/log.out 2>&1
                export PYTHONPATH=`pwd` 1>>/var/log/log.out 2>&1
                cd tracker 1>>/var/log/log.out 2>&1
                python program_name --gcs_input_path gs://input/{userId}/{paymentId} --gcs_output_path gs://output/{userId}/{paymentId} 1>>/var/log/log.out 2>&1
                sudo python3 gcs_to_mongo.py {userId} {paymentId} 1>>/var/log/log.out 2>&1
                sudo shutdown -P now
                """.format(userId=userId, paymentId=paymentId)
                
        service = build('compute', 'v1', cache_discovery=False)
        print('VM Instance starting')
        project = 'XXXX'
        zone = 'us-east1-c'
        instance = 'YYYY'
        metadata = service.instances().get(project=project, zone=zone, instance=instance)
        metares = metadata.execute()
        print(metares)
    
        fingerprint = metares["metadata"]["fingerprint"]
        print(fingerprint)
        bodydata = {"fingerprint": fingerprint,
                    "items": [{"key": "startup-script", "value": startup_script}]}

        print(bodydata)        
        meta = service.instances().setMetadata(project=project, zone=zone, instance=instance,
                                               body=bodydata)
        res = meta.execute()
        instanceget = service.instances().get(project=project, zone=zone, instance=instance).execute()
        request = service.instances().start(project=project, zone=zone, instance=instance)
        response = request.execute()
        print('VM Instance started')
        print(instanceget)
        print("'New Metadata:", instanceget['metadata'])