celery的task支持运行async语法的异步任务

 关键就是调用asyncio.run()这个方法

import asyncio
import time

import aiohttp
from celery import Celery
from celery.result import AsyncResult
from lxml import etree

app = Celery('mytasks', backend='redis://localhost', broker='redis://localhost:6379/0')

#async语法的异步爬虫耗时任务
async def async_func():
    # 也可以用asyncio.sleep模拟耗时任务
    # await asyncio.sleep(3)
    # return 'finish'
    session = aiohttp.ClientSession()
    url = 'https://movie.douban.com/top250'
    async with session.get(url) as response:
        page_source = await response.text()
        html = etree.HTML(page_source)
        title_list = html.xpath('//ol[@class="grid_view"]//div[@class="hd"]/a/span[position()=1]/text()')
        print(title_list)
    return title_list


@app.task(name='mytasks')
def io_func():
    #核心代码asyncio.run
    return asyncio.run(async_func())


def main():
    result = io_func.delay()
    return result.id

#循环访问获取异步任务结果
def get_result(task_id):
    res = AsyncResult(task_id)
    while True:
        print(res.status)
        if res.ready():
            break
        time.sleep(1)
    return res.result


if __name__ == '__main__':
    task_id = main()
    print(task_id)
    res = get_result(task_id)
    print(res)

输出:

c5eec89e-1eff-4a69-8de5-5ad3af934802
PENDING
SUCCESS
['肖申克的救赎', '霸王别姬', '阿甘正传', '这个杀手不太冷', '泰坦尼克号', '美丽人生', '千与千寻', '辛德勒的名单', '盗梦空间', '忠犬八公的故事', '海上钢琴师', '楚门的世界', '三傻大闹宝莱坞', '星际穿越', '机器人总动员', '放牛班的春天', '大话西游之大圣娶亲', '熔炉', '疯狂动物城', '无间道', '龙猫', '教父', '当幸福来敲门', '怦然心动', '触不可及']

参考:https://stackoverflow.com/a/57286909/9917670 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值