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()
kk86 89
2019-03-01 提问
1 个回答
0
  1. 不需要 yield 了,其实是用 await 代替了 yield,用 async 声明函数为 coroutine 类型;
  2. requests 不是一个异步的请求库,即使封装一个 coroutine 函数里用 requests 做网络请求,依然会阻塞;
  3. 在 flask 里面,可以考虑使用 rq 或 celery 实现异步任务。

撰写答案

推广链接