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']
Example #2
0
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)