如何对应用程序进行并行调用?

时间:2019-01-28 12:09:54

标签: python

我正在尝试使用Flask和Python在GAE上构建网络爬虫。我不是构建Web应用程序的专家。

因此,我创建了一个简单的主页,其中有两个按钮,分别是“单个”和“列表”,它们将带您进入可以输入URL并分别上传URL CSV文件的页面。

现在,单个URL部分非常简单,但是列表部分很棘手。假设我上传了一个CSV文件,其中包含“ n”个网址,并且我希望每个网址都调用“单个”部分(可能是n个调用),并且所有调用都需要并行处理,例如多处理/线程。

我该如何处理?谷歌搜索使我进入任务队列,我正在阅读有关内容。但是我想知道哪种方法是最好的方法,任何示例都将不胜感激。

谢谢。

2 个答案:

答案 0 :(得分:0)

您可以使用Pool。在standard multiprocessing lib中。

它需要迭代,并向每个元素并行应用一个函数。

from multiprocessing import Pool

def f(x):
    return x*x

if __name__ == '__main__':
    with Pool(5) as p:
        print(p.map(f, [1, 2, 3]))

答案 1 :(得分:0)

我相信您需要做的是实现asynchronous HTTP requests,这样您就可以同时发送所有n URL请求,并且在您执行脚本操作时不会阻止脚本执行等待请求完成。

您之所以发现Cloud Tasks是实现此目的的一种方式,是因为它们是根据设计异步运行的。

但是,如果需要在脚本的同一运行时中接受HTTP请求之一的响应,最好使用urlfetch。从本文档中,还包括一些代码示例:

  

HTTP(S)请求默认是同步的。发出异步   请求,您的应用程序必须:

     
      
  1. 使用urlfetch.create_rpc()创建一个新的RPC对象。这个对象   代表后续方法调用中的异步调用。
  2.   
  3. 致电urlfetch.make_fetch_call()发出请求。这种方法需要   RPC对象和请求目标的URL作为参数。
  4.   
  5. 调用RPC对象的get_result()方法。如果以下情况,此方法返回结果对象   请求成功,如果发生错误则引发异常   在请求期间发生。
  6.   

您可以使用这两个选项中的任何一个来实现,第一个选项允许您在单独的API中创建和管理请求,可以在应用程序内部调用该API;而另一种则在App Engine(标准)中本地运行,并且可能更易于实现。