In Python (2.7) I try to create processes (with multiprocessing) in a celery task (celery 3.1.17) but it gives the error:
daemonic processes are not allowed to h
billiard
and multiprocessing
are different libraries - billiard
is the Celery project's own fork of multiprocessing
. You will need to import billiard
and use it instead of multiprocessing
However the better answer is probably that you should refactor your code so that you spawn more Celery tasks instead of using two different ways of distributing your work.
You can do this using Celery canvas
from celery import group
@app.task
def sleepawhile(t):
print("Sleeping %i seconds..." % t)
time.sleep(t)
return t
def work(num_procs):
return group(sleepawhile.s(randint(1, 5)) for x in range(num_procs)])
def test(self):
my_group = group(work(randint(1, 5)) for x in range(5))
result = my_group.apply_async()
result.get()
I've attempted to make a working version of your code that uses canvas primitives instead of multiprocessing. However since your example was quite artificial it's not easy to come up with something that makes sense.
Update:
Here is a translation of your real code that uses Celery canvas:
tasks.py
:
@shared_task
run_training_method(saveindex, embedder_id):
embedder = Embedder.objects.get(pk=embedder_id)
embedder.training_method(saveindex)
models.py
:
from tasks import run_training_method
from celery import group
class Embedder(Model):
def embedder_update_task(self):
my_group = []
for saveindex in range(self.start_index, self.start_index + self.nsaves):
self.create_storage(saveindex)
# Add to list
my_group.extend([run_training_method.subtask((saveindex, self.id))
for i in range(self.nproc)])
result = group(my_group).apply_async()