Python環境下で非同期タスクキューを使ったCleryの基礎教程をインストールします。

3542 ワード

1.概要
cellery(セロリ)は非同期の作業行列であり、分散式メッセージに基づいて伝達される作業行列である。リアルタイム操作に重点を置いていますが、スケジュールのサポートもいいです。
セルリーは生産システムで毎日数百万の仕事を処理します。
エクセルはPythonで作成されていますが、このプロトコルはどの言語でも実現できます。他の言語とwebhook sによっても実現できます。
提案されたメッセージエージェントRabbilityMQは、Redis、Benstalk、MongoDB、CouchDB、およびデータベースを提供しています。
エクセルyはDjango、Pylons and Flashkを集めやすいので、django-celleryを使って、cell y-pylons and Flaask-Celeryは包装を付け加えてもいいです。
2.据え付け
上の概念があります。このようなものをインストールする必要があります。RabitMQ、SQLAlchemy、Clery
インストールも簡単です。ラビットMQ:
macの下:

brew install rabbitmq
linux:

sudo apt-get install rabbitmq-server
残りの二つは全部Pythonのものです。直接pipをインストールすればいいです。MySQLドライバをインストールしたことがない学生にはMySQL-pythonをインストールする必要があります。
インストールが完了したら、サービスを開始します。

$ rabbitmq-server[  ]
起動後はウィンドウを閉じずに新しいウィンドウ(Tab)を操作します。
3.簡単なケース
あなたの前のラビットMQが起動されていることを確認します。
それとも公式サイトの例ですか?任意のディレクトリにtasky.pyのファイルを新規作成した内容は以下の通りです。

from celery import Celery

app = Celery('tasks', broker='amqp://guest@localhost//')

@app.task
def add(x, y):
  return x + y

同じクラスのディレクトリで実行:

$ celery -A tasks worker --loglevel=info
このコマンドは、ワーカーを起動して、taskのタスク(add(x,y)をキューに入れるという意味です。
ウィンドウを開けたままにして、新しいウィンドウを開けてインタラクティブモードに入ります。pythonまたはipython:

>>> from tasks import add
>>> add.delay(4, 4)
ここで、あなたはすでにcell eryを使ってタスクを実行できます。上のpythonインタラクティブモードでは、addタスクを簡単に呼び出し、4,4パラメータを伝達します。
しかし、この時点で一つの問題があります。このタスクの実行結果と状態を知りたいです。最後まで終わりましたか?ですから、バックエンドを設置する必要があります。
修正前のtasky.pyのコードは以下の通りです。

# coding:utf-8
import subprocess
from time import sleep

from celery import Celery

backend = 'db+mysql://root:@192.168.0.102/celery'
broker = 'amqp://[email protected]:5672'

app = Celery('tasks', backend=backend, broker=broker)


@app.task
def add(x, y):
  sleep(10)
  return x + y


@app.task
def hostname():
  return subprocess.check_output(['hostname'])

backendを追加する以外に、複数のサーバーの操作をテストするためにwhoの方法を追加しました。修正が完了したら、前のように起動します。
同じくpythonに入るインタラクティブモデル:

>>> from tasks import add, hostname
>>> r = add.delay(4, 4)
>>> r.ready() # 10s   ,   False,  add sleep 10s
>>>
>>> r = hostname.delay()
>>> r.result #     hostname
4.マルチサーバをテストする
上のテストを終えてから、Celryは分散型任務管理と呼ばれていますが、分布式はどこにありますか?その任務はどのように実行されますか?どのマシンで実行しますか?
現在のサーバ上のcelleryサービスがクローズされていない場合、同じ方法で別のサーバにCleryをインストールして起動します。

$ celery -A tasks worker --loglevel=info
前のサーバーのCelleryサービスからあなたが起動したサーバーのhostnameを出力しています。そのサーバーがあなたのrabitmqに接続されていることが前提です。
その後pythonインタラクティブモードに入ります。

>>> from tasks import hostname
>>>
>>> for i in range(10):
...   r = hostname.delay()
...   print r.result #     hostname
>>>
あなたが入力した内容を見てください。2台のサーバーであなたがエクセルサービスの出力を開始しました。
5.RabbiitMQ遠隔接続の問題
テスト開始時にリモートサーバーがローカルのRabbiitMQサービスに接続できなくなりました。その後、設定権限が必要であることが分かりました。IP_ADDRESS=127.1.0.1のipは0.0.0です。
6.まとめて言う
この文章は簡単にCelleryの使用を紹介していますが、ポイントはやはり分布式の使用です。あまりすっきりしないと思うのは、拡張時にコードを再配置する必要があります。直接にtaskyを共有できるのではなく、Cleryはtaskを通じて異なるworkerとのマッチングができるかもしれません。まだよく分かりません。深く使ってから話します。