【问题标题】:Parallel calls to a same function on Google App Engine (Concurrency)并行调用 Google App Engine 上的同一函数(并发)
【发布时间】:2019-01-29 14:02:41
【问题描述】:

我正在尝试使用 python 和 Flask 在 Google App Engine (GAE) 上构建一个网络应用程序。我想知道如何在应用程序中同时多次调用一个函数。例如,我有一个返回元素平方的函数。现在,我将这个函数包装在这样的 URL 下:

@app.route('/single_number',methods = ['GET','POST'])
def square():
    x = request.form.get('input_number')
    return x*x

现在,我想在数字列表上同时在“http://localhost:8080/list_of_numbers”上执行此操作。比如说,我有一个 'n' 数字的列表,我想同时计算每个数字的平方(如果不是所有的 'n' 一起,但至少是谷歌 App Engine 允许的)。我使用了 Python 的多处理库,但由于 Google App Engine 实例中使用的是单核,因此性能没有提高,而且显然,多线程同样是徒劳的。因此,在阅读了更多内容后,我被引导到 GAE 的 Cloud Tasks。但我无法全神贯注地在 Cloud Tasks 上执行此操作。任何与此相关的示例/教程将不胜感激。如果您认为 Cloud Tasks 不是解决此问题的正确方法,是否可以在处理程序“/list_of_numbers”下创建一个函数,该函数将同时将列表的多个数字发送到“/single_number”处理程序?或者你有什么其他的建议吗?

我是网络应用程序构建和 GAE 的新手。因此,任何帮助将不胜感激。

提前致谢

【问题讨论】:

    标签: google-app-engine concurrency


    【解决方案1】:

    这就是使用 google taskqueue(Google Cloud Tasks 的 v1)的样子

        from google.appengine.api import taskqueue
    
        queue = taskqueue.Queue('default')
        ndb.Future.wait_all(queue.add_async(taskqueue.Task(
            url='/single_number/,
            params={'input_number': i})) for i in input_numbers)
    

    这会将一批任务添加到队列中。但是,这不会收到对 /single_number/ 的调用结果,因此每个任务都必须处理接下来发生的任何事情。

    您的问题的答案实际上取决于您要做什么以及您的问题的预期规模。

    感觉就像你想使用谷歌数据流之类的东西

    【讨论】:

    • 谢谢。我会试试这个方法。但是当我尝试在本地(在虚拟环境中)测试它时,甚至当我部署应用程序来测试它时,我总是得到“ModuleNotFoundError: No module named 'google.appengine'”。如何克服此错误进行部署?
    • 您使用的是应用引擎标准吗?这是您第一次从google.appengine 导入任何东西(即您不使用ndbdeferredblobstore 等)?
    • 是的,我符合标准。是的,这将是我第一次从 google.appengine 导入内容。
    • 哪个版本的python
    • 我相信这些库仅适用于 python 2.7。看到这个问题stackoverflow.com/questions/15783783/… 或这个stackoverflow.com/questions/36022960/…,您的环境不满意有几个原因。也许从谷歌云提供的使用这些库的示例项目之一开始,并尝试使其正常工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-05-18
    • 1970-01-01
    • 2019-03-02
    • 2017-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多