2016-10-02 5 views
13

セロリタスクをasyncio.Taskのように見せるラッパーを作成するにはどうすればよいですか?または、セロリーをasyncioと統合するより良い方法はありますか?セロリとasyncioを組み合わせるには?

@asksol、セロリ、said this:の作成者:preforkのにCPUバウンドのタスクをルーティング:

これは、非同期I/Oフレームワークの上に分布する層(トップチップとしてセロリを使用することは非常に一般的です作業者はイベントループをブロックしないことを意味します)。

しかし、具体的にasyncioフレームワークのコード例は見つかりませんでした。公式サイトに記載されているようにセロリのバージョン5.0から可能になります

+0

ことができますあなたは「見た目のように」意味することを明確にします。私はAsksolのコメントを間違って解釈したと思います。あなたは非同期マネージャであるRabbitやSQSのようなフレームワークの中でセロリをinfrontします。 Asyncioを使用するセロリのためのブローカ/プラグインを作成する可能性がありますが、タスクはasyncioのように見えませんか?セロリのポイントは、使用される非同期メソッドを抽象化することですか? – Jmons

答えて

6

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

  1. セロリの次のメジャーバージョンでは、唯一のPython 3.5をサポートしています私たちは取ることを計画しているし、新しいasyncioライブラリの利点
  2. Python 2のサポートを中止することで、膨大な量の互換性コードを削除することができます。Python 3.5では、typing、async/await、asyncioなどの概念を利用できます。

以上前のリンクから引用しました。

したがって、最も良いことはバージョン5.0が配信されるのを待つことです!平均時間で

documentationで説明したようにあなたがrun_in_executorを使用してタスクに任意のブロッキング呼び出しをラップすることができます:)

0

コーディング幸せ、私も例にカスタム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 
) 
関連する問題