我正在尝试使用Flask和Python在GAE上构建网络爬虫。我不是构建Web应用程序的专家。
因此,我创建了一个简单的主页,其中有两个按钮,分别是“单个”和“列表”,它们将带您进入可以输入URL并分别上传URL CSV文件的页面。
现在,单个URL部分非常简单,但是列表部分很棘手。假设我上传了一个CSV文件,其中包含“ n”个网址,并且我希望每个网址都调用“单个”部分(可能是n个调用),并且所有调用都需要并行处理,例如多处理/线程。
我该如何处理?谷歌搜索使我进入任务队列,我正在阅读有关内容。但是我想知道哪种方法是最好的方法,任何示例都将不胜感激。
谢谢。
答案 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)请求默认是同步的。发出异步 请求,您的应用程序必须:
- 使用
urlfetch.create_rpc()
创建一个新的RPC对象。这个对象 代表后续方法调用中的异步调用。- 致电
urlfetch.make_fetch_call()
发出请求。这种方法需要 RPC对象和请求目标的URL作为参数。- 调用RPC对象的
get_result()
方法。如果以下情况,此方法返回结果对象 请求成功,如果发生错误则引发异常 在请求期间发生。
您可以使用这两个选项中的任何一个来实现,第一个选项允许您在单独的API中创建和管理请求,可以在应用程序内部调用该API;而另一种则在App Engine(标准)中本地运行,并且可能更易于实现。