<commit_before>---
layout: post
title: "celery"
date: "2022-05-13"
excerpt: "celeryの使い方"
project: false
config: true
tag: ["python", "celery", "task queue", "async"]
comments: false
---

# celeryの使い方　

## 概要
 - celeryはサーバクライアントモデルのrpcとみなせる
 - 通信のバックエンドにはredisなどを利用できる
 - 実行にはceleryのタスクを実行するサーバサイドのプロセスと、そのタスクをリモートで呼び出すクライアントのプロセスが必要

## インストール

```console
$ python3 -m pip install celery
```

## サーバサイドの実行
 - `task.py`があるときに、同じディレクトリで`$ celery -A tasks worker --loglevel=info`
 - クライアントのプロセスが立ち上がる前にかならずサーバサイドが立ち上がっていること
 - サーバとクライアントのパッケージ粒度と名前空間が同じであること
 - ディレクトリ`bin`の中にある、`bin/tasks.py`を実行するには`$ celery -A bin.tasks worker --loglevel=info`
 - サーバサイドで関数の登録が失われたり、不整合が起きるときは redisを再起動
 - concurrency数の上限を設定
   - `$ celery -A bin.task worker --concurrency=1 --loglevel=CRITICAL`

### サーバサイドのコードの例

```python
from celery import Celery

BROKER_URL = 'redis://localhost:6379/0'
BACKEND_URL = 'redis://localhost:6379/1'

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

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

## クライアントサイドの実行
 - flaskなどからも実行可能である
 - サーバのコードとクライアントのコードはパッケージ粒度と名前空間が同じであること

### クライアントサイドのコードの例

```python
from tasks import add<commit_msg>update "celery" doc<commit_after>---
layout: post
title: "celery"
date: "2022-05-13"
excerpt: "celeryの使い方"
project: false
config: true
tag: ["python", "celery", "task queue", "async"]
comments: false
---

# celeryの使い方　

## 概要
 - celeryはサーバクライアントモデルのrpcとみなせる
   - サーバサイド
     - taskの命令を受け取って実行する
   - クライアントサイド
     - taskをサーバサイドに投げる
 - 通信の仲介のソフトウェアにはredisなどを利用できる
 - 実行にはceleryのタスクを実行するサーバサイドのプロセスと、そのタスクをリモートで呼び出すクライアントのプロセスが必要

## インストール

```console
$ python3 -m pip install celery
```

## サーバサイドの実行
 - `task.py`があるときceleryのプロセスを開始する
   - `$ celery -A tasks worker --loglevel=info`
 - ディレクトリ`bin`の中にある、`bin/tasks.py`を実行
   - `$ celery -A bin.tasks worker --loglevel=info`
 - concurrency数の上限を設定
   - `$ celery -A bin.task worker --concurrency=1 --loglevel=CRITICAL`
 - 注意点
   - サーバサイドで関数の登録が失われたり、不整合が起きるときは redisを再起動
   - クライアントのプロセスが立ち上がる前にかならずサーバサイドが立ち上がっていること
   - サーバとクライアントのパッケージ粒度と名前空間が同じであること

### サーバサイドのコードの例
 - 仲介ソフトにはredisを利用

```python
from celery import Celery

BROKER_URL = 'redis://localhost:6379/0'
BACKEND_URL = 'redis://localhost:6379/1'

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

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

## クライアントサイドの実行
 - 普通のpythonスクリプトとして実行する
 - flaskなどからも実行可能である
 - 注意点
   - サーバのコードとクライアントのコードはパッケージ粒度と名前空間が同じであること

### クライアントサイドのコードの例

```python
from tasks import add
{'fraction_non_alphanumeric': 0.12634515743324035, 'fraction_numerical': 0.015942606616181746, 'mean_word_length': 4.615212527964206, 'pattern_counts': {'":': 0, '<': 3, '<?xml version=': 0, '>': 3, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '2996597', 'n_tokens_mistral': 1531, 'n_tokens_neox': 1415, 'n_words': 183}