2016-10-02 88 views
13

如何创建一个使芹菜任务看起来像asyncio.Task的包装?或者是否有更好的方法将Celery与asyncio整合?如何将芹菜与asyncio结合?

@asksol,芹菜的创建者,said this:

这是相当常见的是使用芹菜作为异步I/O结构(顶尖的顶部上的分布层:路由CPU密集型任务到一个预派生工作人员意味着他们不会阻止你的事件循环)。

但我找不到任何专门用于asyncio框架的代码示例。

+0

能你澄清你的意思是'看起来像'。我认为也许你误解了Asksol的评论 - 你把芹菜作为异步管理者的框架,如Rabbit或SQS。因此,您可以为使用asyncio的芹菜制作代理/插件,但这些任务不会“看起来像”(即具有)asyncio的界面?芹菜的要点是要抽象使用的异步方法? – Jmons

回答

6

在官方网站表示,将有可能从芹菜5.0版:

http://docs.celeryproject.org/en/latest/whatsnew-4.0.html#preface

  1. 芹菜的下一个主要版本将支持Python的3.5只,是我们计划采取新的asyncio库的优势。
  2. 删除对Python 2的支持将使我们能够删除大量的兼容性代码,并且使用Python 3.5可以让我们利用键入,异步/等待,asyncio以及类似的概念,而在旧版本中没有其他选择。

以上是引用自上一个链接的内容。

所以最好的办法是等待版本5.0分发!

与此同时,快乐编码:)

0

你可以用使用run_in_executor任何阻塞调用到任务中documentation描述的,我也是在例如添加自定义timeout

def run_async_task(
    target, 
    *args, 
    timeout = 60, 
    **keywords 
) -> Future: 
    loop = asyncio.get_event_loop() 
    return asyncio.wait_for(
     loop.run_in_executor(
      executor, 
      functools.partial(target, *args, **keywords) 
     ), 
     timeout=timeout, 
     loop=loop 
    ) 
loop = asyncio.get_event_loop() 
async_result = loop.run_until_complete(
    run_async_task, your_task.delay, some_arg, some_karg="" 
) 
result = loop.run_until_complete(
    run_async_task, async_result.result 
)