最近,我创建了一个芹菜项目,整个项目看起来像这样
proj
|-- math
| |-- tasks.py (add)
|
我用一个命令'celery -A proj worker -l info'开始了一个工作人员;
-------------- celery@Jacky v3.1.15 (Cipater)
---- **** -----
--- * *** * -- Windows-7-6.1.7601-SP1
-- * - **** ---
- ** ---------- [config]
- ** ---------- .> app: XXXX:0x40706d8
- ** ---------- .> transport: amqp://guest:**@localhost:5679//
- ** ---------- .> results: mongodb://localhost:27017/
- *** --- * --- .> concurrency: 4 (prefork)
-- ******* ----
--- ***** ----- [queues]
-------------- .> celery exchange=celery(direct) key=celery
然后添加了一个名为 text 的新包[[最新的代码结构如下所示]
proj
|-- math
| |-- tasks.py (add)
|
|-- text
| |-- tasks.py (scan)
目前,我想通过以下代码重新启动worker
app.control.broadcast('pool_restart', {'modules': ['proj.math.tasks',
'proj.text.tasks']})
为了检查它,我跑了 celery -A proj inspect registered 。得到以下结果
-> celery@Jacky: OK
* proj.math.tasks.add
* proj.math.tasks.minus
* proj.text.tasks.scan
结果表明已成功添加扫描任务。之后,我尝试使用以下代码执行新添加的任务
result = app.send_task('proj.text.tasks.scan', args=('fjkdjfdfj.mp3',))
print result.get(timeout=1)
然而,我收到以下错误
Traceback (most recent call last):
File "C:\Python27\lib\site-packages\billiard\pool.py", line 361, in workloop
result = (True, prepare_result(fun(*args, **kwargs)))
File "C:\Python27\lib\site-packages\celery\app\trace.py", line 349, in _fast_trace_task
return _tasks[task].__trace__(uuid, args, kwargs, request)[0]
File "C:\Python27\lib\site-packages\celery\app\registry.py", line 27, in __missing__
raise self.NotRegistered(key)
第27行中的 self 是 celery.app.registry.TaskRegistry 类型的对象。我发现存在多个这种类型的对象。也就是说,池中的每个子进程仍然维护TaskRegistry的实例。
为什么芹菜-A项目检查注册的结果包括'扫描',但我仍然得到** NotRegistered'例外?是否因为池中的子进程不与主进程同步。
答案 0 :(得分:0)
如果任务未在当前流程中注册,则可以使用send_task()
来代替调用任务。但通常您会使用delay
或apply_async
,因为send_task
会按名称调用任务,这可能会导致some errors
您可以将任务称为
tasks.scan.apply_async(args=['fjkdjfdfj.mp3',], timeout=1)
如果您确实只想使用send_task
调用任务,请为您的工作人员命名,这样可以更轻松地调用任务。所以你的任务看起来应该是
from celery import task
@task(name='my_named_task')
def scan(foo):
#do something in background
然后你可以使用send_task
调用它而不会有任何问题。
app.send_task('my_named_task', args=('fjkdjfdfj.mp3',))