1.在tornado 中 使用 Celery
2.Celery的進階
2.1回調
官方文檔中把回調稱爲linking tasks。和回調差不多一個意思。這個回調怎麼用呢,請看下面例子。
這個link就相當於tornado中的callback了
add.apply_async((2,2),link = add.s(16))
這個函數返回的值爲20,這個20怎麼來呢?
其實就是先執行第一個任務add(2,2) ,第一個任返回的結果傳遞給回調函數,然後add(4,16).最後就的好20了。這個例子很簡單,
不過這個例子有個疑問—add.s(16),這個s是怎麼回事?突然出現這個s,而且以前沒有見過啊。
官網canvas guide裏有說明的,這個咱們簡單的學習一下。
>>>add.subtask((2, 2), countdown=10)
tasks.add(2, 2)
>>>add.s(2, 2)
tasks.add(2, 2)
add.s()就相當於subtask()方法,等於它的簡寫。
特殊變量
EAT(estimated time of arrival) 預計到達時間
result = add.apply_async((2, 2), countdown=3)
#我們通過countdown變量設置它
result.get()
4
那麼這個變量的作用是什麼呢?我們可以給這個參數設定一個特殊的日期(date)或者時間(time),那麼在這個時間內這個函數是不會返回結果的。上面那個例子代表我們至少需要等待3秒才能得到返回結果。
Message Sending Retry
celey將會在事件連接的失敗時候自動重新連接,通過設置retry變量可以控制是否重新連接。比如retry=False表示連接失敗後不重連。
不過還有更高級的配置
add.apply_async((2, 2), retry=True, retry_policy={
'max_retries': 5,
'interval_start': 0,
'interval_step': 0.2,
'interval_max': 0.8,
})
- max_retries :最大重連次數,設爲None表示無限次數的重連。
- interval_start:第一次兩次重連的等待時間,單位秒,默認爲0
- interval_max:重連登臺時間 的最大值默認0.2
nterval_step:重連時間增量的步長,默認0.2
剛纔的例子裏重連的間隔從0開始,每次增長0.2s,當間隔到帶0.8的時候就不增長了。
Serializers
worker 返回來內容的格式。默認爲pickle python有專門的包。
不過我們可是設置 json,pickle,ymal,msgpack。
add.apply_async((10, 10), serializer='json')
不過每調用一次都要設置它不是很麻煩麼,我們可以定義celery設在它。這樣就不必每次都設置了。
通過CELERY_TASK_PUBLISH_RETRY 就可以了。
所有的設這內容都在這裏了
3.celery的配置(Configuration)
不過一般情況下我們不必對Celery進行配置哈,如果你有啥特殊的要求的話就需要了解這一方面了。
怎麼配置
配置的格式(等號連接)
## Broker settings.
BROKER_URL = 'amqp://guest:guest@localhost:5672//'
# List of modules to import when celery starts.
CELERY_IMPORTS = ('myapp.tasks', )
## Using the database to store task state and results.
CELERY_RESULT_BACKEND = 'db+sqlite:///results.db'
CELERY_ANNOTATIONS = {'tasks.add': {'rate_limit': '10/s'}}
配置單個條目
app.conf.CELERY_TASK_SERIALIZER = 'json'
要配置多個
app.conf.update(
CELERY_TASK_SERIALIZER='json',
CELERY_ACCEPT_CONTENT=['json'], # Ignore other content
CELERY_RESULT_SERIALIZER='json',
CELERY_TIMEZONE='Europe/Oslo',
CELERY_ENABLE_UTC=True,
)
常用的配置選項
CELERY_RESULT_BACKEND