flask中使用requests如何用协程实现并行?

发布于 2022-09-11 18:03:25 字数 1394 浏览 23 评论 0

我希望使用async/await语法实现并行,看了一些资料这个是取代了yield语法的,所以我猜是不需要yield了吧?不过我试了许多方式行不通,以下是一个类似爬虫的程序,能改成协助程并行的方式给个示例吗?希望不会有“用Scrapy就好了”这样的回复,虽然Scrapy做好了这些工作,只要yield一个请求回去就行,但我希望的是自己实现,因为其实我的程序实际上并不是一个爬虫,只是附带了一些网络请求和文件读写,希望并行处理,而Scrapy里的东西除了请求器其它不是我要用的。

(相关背景:本人从别的语言转过来快速恶补了2周python勉强把项目搭了起来,用的是python3.6版本)

以下是代码示例结构:

from flask import Flask, jsonify
import requests
import asyncio

app = Flask(__name__)

class 站点A请求器():
    def run(self):
        resp = requests.get('http://www.baidu.com')
        result = resp.text[0:100]
        result += 'xxx' #做一些计算,实际上还有cookie什么的
        return 0, result #返回的第一个值会根据计算的过程确定个体的数字,反正就是要返回多个值


class 站点B请求器():
    def run(self):
        resp = requests.get('http://www.qq.com')
        result = resp.text[0:100]
        result += 'yyy' #同上
        return 3, result


@app.route('/test')
def test():
    def 请求所有站点(sites):
        resultSet = {}
        for site in sites:
            requestor = None
            if site == 'a':
                requestor = 站点A请求器()
            if site == 'b':
                requestor = 站点B请求器()
            code, result = requestor.run()

            resultSet[site] = {
                'code': code,
                'result': result,
            }
            
        return resultSet

    result = 请求所有站点(['a', 'b'])

    return jsonify({'data': result})


app.run()

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

三生路 2022-09-18 18:03:25
  1. 不需要 yield 了,其实是用 await 代替了 yield,用 async 声明函数为 coroutine 类型;
  2. requests 不是一个异步的请求库,即使封装一个 coroutine 函数里用 requests 做网络请求,依然会阻塞;
  3. 在 flask 里面,可以考虑使用 rq 或 celery 实现异步任务。
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文