- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试测试一个简单的 Celery 应用程序。
config.py
extract/
celery.py
celeryconfig.py
tasks.py
playlists/
playlist.json
config.py
from os import environ
# Configs
REDIS_HOST = "0.0.0.0"
REDIS_PORT = 6379
BROKER_URL = environ.get('REDIS_URL', "redis://{host}:{port}/0".format(
host=REDIS_HOST, port=str(REDIS_PORT)))
CELERY_RESULT_BACKEND = BROKER_URL
celery.py
from __future__ import absolute_import
from celery import Celery
from . import celeryconfig
app = Celery('extract')
app.config_from_object(celeryconfig)
app.autodiscover_tasks(['extract'], force=True)
@app.task(bind=True)
def debug_task(self):
print('Request: {0!r}'.format(self.request))
tasks.py
任务基本上是一个提取队列
,如下所示:
@app.task(queue='extraction')
def playlist_generator_with_audio_features(username):
playlist_ids = get_user_playlists(username)
api = get_api_client()
(...) # some more code
export_playlist_with_audio_features.delay(username=username, playlist_id=playlist_id,
artist=artist, track=track, popularity=popularity,
energy=energy, liveness=liveness, tempo=tempo,
speechiness=speechiness, acousticness=acousticness,
instrumentalness=instrumentalness, time_signature=time_signature,
danceability=danceability, key=key, duration_ms=duration_ms,
loudness=loudness, valence=valence, mode=mode,
uri=uri, preview=preview)
logger.info('Got audio features from {} track(s) in playlist id:{} by username {}'.format(
len(tracks_and_features),
playlist_id,
username
))
return True
和一个编写器队列
,如下所示:
@app.task(queue='writer')
def export_playlist_with_audio_features(username, playlist_id, artist, track, popularity,
energy, liveness,tempo, speechiness, acousticness,
instrumentalness, time_signature, danceability,
key, duration_ms, loudness, valence, mode,
uri, preview):
path = 'playlists/playlist.json'
obj = json.dumps({
'username':username,
'playlist_id': playlist_id,
'artist': artist,
'track': track,
'popularity': popularity,
'energy': energy,
'liveness': liveness,
'tempo': tempo,
'speechiness': speechiness,
'acousticness': acousticness,
'instrumentalness': instrumentalness,
'time_signature': time_signature,
'danceability': danceability,
'key': key,
'duration_ms': duration_ms,
'loudness': loudness,
'valence': valence,
'mode': mode,
'uri': uri,
'preview': preview
})
codecs.open(path, 'a', encoding='utf-8').write(obj + '\n')
logger.debug('Exported track {} by {} with audio features. Playlist owner: {}'.format(
track, artist, username))
return True
celeryconfig.py
from __future__ import absolute_import, unicode_literals
import os
from celery.schedules import crontab
INSTALLED_APPS = ['app'] # include app
CELERY_TASK_RESULT_EXPIRES = 30
CELERY_TIMEZONE = 'UTC'
CELERY_ACCEPT_CONTENT = ['json']
CELERY_TASK_SERIALIZER = 'json'
CELERY_RESULT_SERIALIZER = 'json'
CELERY_IMPORTS = ('extract.tasks')
DEFAULT_URL = 'redis://localhost:6379/0'
BROKER_URL = os.environ.get('EXTRACT_BROKER_URL', DEFAULT_URL)
CELERY_RESULT_BACKEND = os.environ.get('EXTRACT_RESULT_BACKEND',
DEFAULT_URL)
CELERYBEAT_SCHEDULE = {
'playlist_generator_with_audio_features': {
'task': 'extract.tasks.playlist_generator_with_audio_features',
# Every minute
'schedule': crontab(minute="*"),
'args' : [(1),]
},
'export_playlist_with_audio_features': {
'task': 'extract.tasks.export_playlist_with_audio_features',
# Every minute
'schedule': crontab(minute="*"),
'kwargs' : {"username":"username",
"playlist_id": "playlist_id",
"artist": "artist",
"track": "track",
"popularity": "popularity",
"energy":"energy",
"liveness": "liveness",
"tempo": "tempo",
"speechiness": "speechiness",
"acousticness":"acousticness",
"instrumentalness":"instrumentalness",
"time_signature":"time_signature",
"danceability":"danceability",
"key": "key",
"duration_ms": "duration_ms",
"loudness": "loudness",
"valance": "valance",
"mode":"mode",
"uri":"uri",
"preview": "preview"},
}
}
Celery 工作人员自行工作,即任务将 json
序列化数据转储到 playlists/
中,使用以下命令:
$celery worker -A提取-l信息-Q提取
[2018-12-16 23:31:58,075: WARNING/MainProcess] celery@Vitors-MacBook-Pro-2.local ready.
[2018-12-16 23:32:29,494: INFO/MainProcess] Received task: extract.tasks.playlist_generator_with_audio_features[0713b788-c004-4c0c-b1ee-85068287856a]
[2018-12-16 23:32:30,892: INFO/Worker-4] extract.tasks.get_user_playlists[None]: Playlist name: Discover Weekly, Number of songs: 30, Playlist ID: 37i9dQZEVXcRI2aS94C6hY
[2018-12-16 23:32:30,893: INFO/Worker-4] extract.tasks.get_user_playlists[None]: Playlist name: Time, Number of songs: 10, Playlist ID: 1qxOGf3xD3fDQs03kwKteg
[2018-12-16 23:32:30,893: INFO/Worker-4] extract.tasks.get_user_playlists[None]: Playlist name: Vocoder, Number of songs: 280, Playlist ID: 7nROSBznyIkVgjSdNaHDxm
和
$ celeryworker -A extract -l info -Q writer
[2018-12-16 23:32:14,198: WARNING/MainProcess] celery@Vitors-MacBook-Pro-2.local ready.
[2018-12-16 23:32:32,467: INFO/MainProcess] Received task: extract.tasks.export_playlist_with_audio_features[a73f776d-2412-4aed-8e84-50c6485ebac8]
[2018-12-16 23:32:32,470: INFO/MainProcess] Received task: extract.tasks.export_playlist_with_audio_features[930fb552-5687-48ce-b61d-b573a79aa13c]
[2018-12-16 23:32:32,479: INFO/MainProcess] Received task: extract.tasks.export_playlist_with_audio_features[162a77a1-20ba-48c3-86c3-bb9c51eeed75]
[2018-12-16 23:32:32,486: INFO/MainProcess] Received task: extract.tasks.export_playlist_with_audio_features[89eff015-e692-4af0-a7a8-dcad06dc2e3f]
但是当我尝试使用celerybeat
来执行任务时,工作人员仅选择第一轮任务,而不是定期选择。
celerybeat -A app.celery --schedule=/tmp/celerybeat-schedule --loglevel=INFO --pidfile=/tmp/celerybeat.pid
Configuration ->
. broker -> redis://localhost:6379/0
. loader -> celery.loaders.app.AppLoader
. scheduler -> celery.beat.PersistentScheduler
. db -> /tmp/celerybeat-schedule
. logfile -> [stderr]@%INFO
. maxinterval -> now (0s)
[2018-12-16 23:32:32,706: INFO/MainProcess] beat: Starting...
[2018-12-16 23:32:32,736: INFO/MainProcess] Scheduler: Sending due task export_playlist_with_audio_features (tasks.export_playlist_with_audio_features)
[2018-12-16 23:32:32,743: INFO/MainProcess] Scheduler: Sending due task playlist_generator_with_audio_features (tasks.playlist_generator_with_audio_features)
[2018-12-16 23:33:00,000: INFO/MainProcess] Scheduler: Sending due task playlist_generator_with_audio_features (tasks.playlist_generator_with_audio_features)
我在这里缺少什么?
最佳答案
@app.task(queue='extraction')
此处的选项不会被beat使用。使用 @periodic_task 装饰器来进行节拍,并且常规 celery 客户端使用特定的队列。
@periodic_task(run_every=crontab(minute='5'),
queue='celery_periodic',
options={'queue': 'celery_periodic'})
queue='celery_periodic'
选项在您从代码(.delay 或 .apply_async)调用任务时使用
options={'queue': 'celery_periodic'}
选项在 celerybeat 调用它时使用。
您还可以在时间表配置中提供节拍选项,例如
CELERYBEAT_SCHEDULE = {
'playlist_generator_with_audio_features': {
'task': 'extract.tasks.playlist_generator_with_audio_features',
'schedule': crontab(minute="*"),
'options': {'queue' : 'celery_periodic'} # specify queue
},
}
关于python - 工作人员没有定期从 celery-beat 中挑选任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53808483/
我正在处理一组标记为 160 个组的 173k 点。我想通过合并最接近的(到 9 或 10 个组)来减少组/集群的数量。我搜索过 sklearn 或类似的库,但没有成功。 我猜它只是通过 knn 聚类
我有一个扁平数字列表,这些数字逻辑上以 3 为一组,其中每个三元组是 (number, __ignored, flag[0 or 1]),例如: [7,56,1, 8,0,0, 2,0,0, 6,1,
我正在使用 pipenv 来管理我的包。我想编写一个 python 脚本来调用另一个使用不同虚拟环境(VE)的 python 脚本。 如何运行使用 VE1 的 python 脚本 1 并调用另一个 p
假设我有一个文件 script.py 位于 path = "foo/bar/script.py"。我正在寻找一种在 Python 中通过函数 execute_script() 从我的主要 Python
这听起来像是谜语或笑话,但实际上我还没有找到这个问题的答案。 问题到底是什么? 我想运行 2 个脚本。在第一个脚本中,我调用另一个脚本,但我希望它们继续并行,而不是在两个单独的线程中。主要是我不希望第
我有一个带有 python 2.5.5 的软件。我想发送一个命令,该命令将在 python 2.7.5 中启动一个脚本,然后继续执行该脚本。 我试过用 #!python2.7.5 和http://re
我在 python 命令行(使用 python 2.7)中,并尝试运行 Python 脚本。我的操作系统是 Windows 7。我已将我的目录设置为包含我所有脚本的文件夹,使用: os.chdir("
剧透:部分解决(见最后)。 以下是使用 Python 嵌入的代码示例: #include int main(int argc, char** argv) { Py_SetPythonHome
假设我有以下列表,对应于及时的股票价格: prices = [1, 3, 7, 10, 9, 8, 5, 3, 6, 8, 12, 9, 6, 10, 13, 8, 4, 11] 我想确定以下总体上最
所以我试图在选择某个单选按钮时更改此框架的背景。 我的框架位于一个类中,并且单选按钮的功能位于该类之外。 (这样我就可以在所有其他框架上调用它们。) 问题是每当我选择单选按钮时都会出现以下错误: co
我正在尝试将字符串与 python 中的正则表达式进行比较,如下所示, #!/usr/bin/env python3 import re str1 = "Expecting property name
考虑以下原型(prototype) Boost.Python 模块,该模块从单独的 C++ 头文件中引入类“D”。 /* file: a/b.cpp */ BOOST_PYTHON_MODULE(c)
如何编写一个程序来“识别函数调用的行号?” python 检查模块提供了定位行号的选项,但是, def di(): return inspect.currentframe().f_back.f_l
我已经使用 macports 安装了 Python 2.7,并且由于我的 $PATH 变量,这就是我输入 $ python 时得到的变量。然而,virtualenv 默认使用 Python 2.6,除
我只想问如何加快 python 上的 re.search 速度。 我有一个很长的字符串行,长度为 176861(即带有一些符号的字母数字字符),我使用此函数测试了该行以进行研究: def getExe
list1= [u'%app%%General%%Council%', u'%people%', u'%people%%Regional%%Council%%Mandate%', u'%ppp%%Ge
这个问题在这里已经有了答案: Is it Pythonic to use list comprehensions for just side effects? (7 个答案) 关闭 4 个月前。 告
我想用 Python 将两个列表组合成一个列表,方法如下: a = [1,1,1,2,2,2,3,3,3,3] b= ["Sun", "is", "bright", "June","and" ,"Ju
我正在运行带有最新 Boost 发行版 (1.55.0) 的 Mac OS X 10.8.4 (Darwin 12.4.0)。我正在按照说明 here构建包含在我的发行版中的教程 Boost-Pyth
学习 Python,我正在尝试制作一个没有任何第 3 方库的网络抓取工具,这样过程对我来说并没有简化,而且我知道我在做什么。我浏览了一些在线资源,但所有这些都让我对某些事情感到困惑。 html 看起来
我是一名优秀的程序员,十分优秀!