def create_task(queue, name, task_data=None, callback=None, max_retry=3, execution_time=None, timeout=60): ''' Create a task. >>> tid = create_task('sample_queue', 'sample_task', 'task data') >>> f = fetch_task('sample_queue') >>> f.id==tid True >>> f.task_data u'task data' >>> f2 = fetch_task('sample_queue') >>> f2 is None True ''' if not queue: queue = _DEFAULT_QUEUE if not name: name = 'unamed' if callback is None: callback = '' if callback and not callback.startswith( 'http://') and not callback.startswith('https://'): return dict(error='cannot_create_task', description='invalid callback') if task_data is None: task_data = '' if max_retry < 0: max_retry = 0 if timeout <= 0: return dict(error='cannot_create_task', description='invalid timeout') current = time.time() if execution_time is None: execution_time = current task = dict( \ id=db.next_str(), \ queue=queue, \ name=name, \ callback=callback, \ timeout=timeout, \ status=_PENDING, \ max_retry=max_retry, \ retried=0, \ creation_time=current, \ execution_time=execution_time, \ execution_start_time=0.0, \ execution_end_time=0.0, \ execution_expired_time=0.0, \ task_data=task_data, task_result='', version=0) db.insert('tasks', **task) return task['id']
def create_task(queue, name, task_data=None, callback=None, max_retry=3, execution_time=None, timeout=60): ''' Create a task. >>> tid = create_task('sample_queue', 'sample_task', 'task data') >>> f = fetch_task('sample_queue') >>> f.id==tid True >>> f.task_data u'task data' >>> f2 = fetch_task('sample_queue') >>> f2 is None True ''' if not queue: queue = _DEFAULT_QUEUE if not name: name = 'unamed' if callback is None: callback = '' if callback and not callback.startswith('http://') and not callback.startswith('https://'): return dict(error='cannot_create_task', description='invalid callback') if task_data is None: task_data = '' if max_retry < 0: max_retry = 0 if timeout <= 0: return dict(error='cannot_create_task', description='invalid timeout') current = time.time() if execution_time is None: execution_time = current task = dict( \ id=db.next_str(), \ queue=queue, \ name=name, \ callback=callback, \ timeout=timeout, \ status=_PENDING, \ max_retry=max_retry, \ retried=0, \ creation_time=current, \ execution_time=execution_time, \ execution_start_time=0.0, \ execution_end_time=0.0, \ execution_expired_time=0.0, \ task_data=task_data, task_result='', version=0) db.insert('tasks', **task) return task['id']
def _do_fetch_task(queue, _debug=False): task = None current = time.time() with db.transaction(): tasks = db.select('select * from tasks where execution_plan_time<? and queue=? and status=? order by execution_plan_time limit ?', current, queue, _PENDING, 1) if tasks: task = tasks[0] if not task: return None if _debug: time.sleep(1) expires = current + task.timeout execution_id = db.next_str() with db.transaction(): if 0==db.update('update tasks set status=?, execution_id=?, execution_start_time=?, execution_expired_time=?, version=version+1 where id=? and version=?', _EXECUTING, execution_id, current, expires, task.id, task.version): logging.info('version conflict: expect %d.' % task.version) raise ConflictError() return Dict(id=task.id, execution_id=execution_id, queue=task.queue, name=task.name, task_data=task.task_data, version=task.version+1)