def push_task(full_func_name, *args, **kw): """ callback: 这是另外一个注册的task,在func调用完毕后,会启动这个 加入队列:: task_regitry.push(u'foo:echo', aaa, bb, foo='bar', callback='foo:callback', callback_args=(12,32,3), callback_kw={}) """ system = kw.pop('ztq_system', 'default') queue_name, func_name = split_full_func_name(full_func_name) to_right = kw.pop('ztq_first', False) # 队列运行相关信息 runtime = kw.pop('runtime', \ {'create':int(time.time()), 'queue':queue_name}) task = gen_task(func_name, *args, **kw) task_md5 = _get_task_md5(task) task_hash = model.get_task_hash(queue_name, system=system) # 因为queue队列有worker不停在监视,必须先将hash的内容push,在将queue的内容push task['runtime'] = runtime if task_hash.__setitem__(task_md5, task) == 1: # 如果返回值等于0, 说明task_md5已经存在 queue = model.get_task_queue(queue_name, system=system) queue.push(task_md5, to_left=not to_right)
def has_task(queue_name, task, to_front=False): """ 检查是否存在某个job 在queue_name的队列上,在arg_index的位置,对于func_name, 值为arg_value 如果不存在,返回false, 在worker中工作,返回‘work', 队列中返回’queue' """ runtime = task.pop('runtime', None) task_md5 = _get_task_md5(task) if not runtime is None: task['runtime'] = runtime # 检查work现在的工作 worker_list = model.get_all_worker() for worker_name in worker_list: worker_job = model.get_job_state(worker_name) if not worker_job: continue for thread_name, job in worker_job.items(): job.pop('runtime', '') job.pop('process', '') if _get_task_md5(job) == task_md5: return 'running' # 检查所在队列 queue_name = queue_name task_hash = model.get_task_hash(queue_name) if task_md5 in task_hash: if to_front: # 调整顺序 task_queue = model.get_task_queue(queue_name) task_queue.remove(task_md5) task_queue.push(task_md5, to_left=False) return 'queue' return 'none'