asynchronous refactoring
- don't execute celery tasks directly - introduce optional parameters to fileserver tasks to allow chaining - handle user/group/key create and delete tasks in new osusers.signals class - adapt unit tests - change TaskResults model to store the task signatures - generalize the local settings' logging configuration
This commit is contained in:
parent
bcfea10e6f
commit
d5bba7a22d
12 changed files with 290 additions and 170 deletions
|
@ -12,15 +12,21 @@ from gnuviechadmin.celery import app
|
|||
|
||||
|
||||
class TaskResultManager(models.Manager):
|
||||
def create_task_result(self, asyncresult, name):
|
||||
taskresult = self.create(task_id=asyncresult.id, task_name=name)
|
||||
def create_task_result(self, creator, signature, notes=''):
|
||||
sigstr = str(signature)
|
||||
result = signature.apply_async()
|
||||
taskresult = self.create(
|
||||
task_id=result.task_id, creator=creator, signature=sigstr,
|
||||
notes=notes)
|
||||
return taskresult
|
||||
|
||||
|
||||
@python_2_unicode_compatible
|
||||
class TaskResult(models.Model):
|
||||
task_id = models.CharField(_('Task id'), max_length=36)
|
||||
task_name = models.CharField(_('Task name'), max_length=64)
|
||||
signature = models.TextField(_('Task signature'))
|
||||
creator = models.TextField(_('Task creator'))
|
||||
notes = models.TextField(_('Task notes'))
|
||||
result = models.TextField(_('Task result'))
|
||||
finished = models.BooleanField(default=False)
|
||||
state = models.CharField(_('Task state'), max_length=16)
|
||||
|
@ -32,8 +38,8 @@ class TaskResult(models.Model):
|
|||
verbose_name_plural = _('Task results')
|
||||
|
||||
def __str__(self):
|
||||
return "{task_name} ({task_id}): {finished}".format(
|
||||
task_name=self.task_name,
|
||||
return "{creator} ({task_id}): {finished}".format(
|
||||
creator=self.creator,
|
||||
task_id=self.task_id,
|
||||
finished=_('yes') if self.finished else _('no')
|
||||
)
|
||||
|
@ -41,7 +47,8 @@ class TaskResult(models.Model):
|
|||
def fetch_result(self):
|
||||
if not self.finished:
|
||||
ar = app.AsyncResult(self.task_id)
|
||||
res = ar.get(no_ack=True, timeout=1)
|
||||
self.result = str(res)
|
||||
self.state = ar.state
|
||||
self.finished = True
|
||||
if ar.ready():
|
||||
res = ar.get()
|
||||
self.result = str(res)
|
||||
self.finished = True
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue