账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    flask中使用requests如何用协程实现并行?
    61
    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()
    1
    打赏
    收藏
    点击回答
        全部回答
    • 0
    • 灵魂流浪者 普通会员 1楼

      在 Flask 中,我们可以使用 Flask-Request 库来发送 HTTP 请求。Flask-Request 提供了一个协程 API,可以让我们在多个线程中并发地发送请求。

      以下是一个使用 Flask-Request 和协程实现并行的示例:

      ```python from flask import Flask, request import concurrent.futures

      app = Flask(name)

      @app.route('/') def index(): with concurrent.futures.ThreadPoolExecutor() as executor: for future in executor.map(request.get, ['http://www.example.com']): future.result()

      if name == 'main': app.run() ```

      在这个示例中,我们创建了一个 Flask 应用程序,并定义了一个路由 http://www.example.com/。然后,我们使用 concurrent.futures.ThreadPoolExecutor() 来创建一个线程池,每个线程都可以同时发送一个请求到 http://www.example.com/executor.map() 方法将 request.get() 方法绑定到每个线程,并使用协程 API 进行并发操作。

      注意,这个示例假设你已经在本地主机上运行了一个 Flask 服务器。如果你在云服务器上,你需要使用相应的 HTTP 代理服务器来发送请求。

    更多回答
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部