Python 芹菜-池_重启不支持添加新任务

Python 芹菜-池_重启不支持添加新任务,python,celery,Python,Celery,最近,我创建了一个芹菜项目,整个项目看起来像这样 proj |-- math | |-- tasks.py (add) | 我用命令“芹菜-项目工人-l信息”启动了一个工人 -------------- celery@Jacky v3.1.15 (Cipater) ---- **** ----- --- * *** * -- Windows-7-6.1.7601-SP1 -- * - **** --- - ** ---------- [config] - ** -----

最近,我创建了一个芹菜项目,整个项目看起来像这样

proj
  |-- math
  |    |-- tasks.py (add)
  |
我用命令“芹菜-项目工人-l信息”启动了一个工人

 -------------- 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']})
result = app.send_task('proj.text.tasks.scan', args=('fjkdjfdfj.mp3',))
print result.get(timeout=1)
为了检查它,我运行了芹菜项目。得到了如下结果

-> celery@Jacky: OK
    * proj.math.tasks.add
    * proj.math.tasks.minus
    * proj.text.tasks.scan
结果表明任务扫描已成功添加。之后,我尝试使用以下代码执行新添加的任务

app.control.broadcast('pool_restart', {'modules': ['proj.math.tasks',
                                                   'proj.text.tasks']})
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
是芹菜.app.registry.TaskRegistry
类型的对象。我发现这种类型的对象不止一个。也就是说,池中的每个子进程仍然维护TaskRegistry'的一个实例


为什么芹菜-A proj inspect registed的结果包括“扫描”,但我仍然得到**notregisted“异常?这是因为池中的子进程与主进程不同步。

如果任务未在当前进程中注册,则可以使用
send_task()
按名称调用任务。但通常使用
delay
apply\u async
代替,因为
send\u task
按名称调用task,这可能导致

您可以将您的任务称为

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',))

使用apply_async和重命名任务都无法在my Side中工作池中的每个工作进程都维护TaskRegistry的实例。该值与主流程中的值不同。这是根本原因吗?