听python huey事件 - 运行一次监听器?

时间:2017-10-06 09:48:45

标签: python events flask listener python-huey

我尝试将python huey队列合并到我的烧瓶应用程序中,我把它全部工作了。我用它在我的工作流中运行任务,当任务运行时我将它隐藏起来(将huey.task中的task_id添加到数据库中的taskstatus) - 否则看起来同样的任务被卡住,但实际上它在后台运行。

现在棘手的部分是在huey任务完成时显示我的任务。我在huey docs中整合了事件监听器(迭代huey.storage),但从我的理解,它订阅了redis并无限期运行(因为有定期任务检查)。所以根据我的理解,事件监听器本身必须在单独的线程中运行,所以我写了一个huey任务来听取huey任务:

@huey.task(include_task=True)
def get_huey_events(task):
    from huey.consumer import EVENT_FINISHED
    app = create_huey_app('development')
    with app.app_context():
        # store huey task id and name in database
        task1 = HueyTask(task.task_id, task.name)
        db.session.add(task1)
        db.session.commit()
        for event in huey.storage:
            if event['status'] == EVENT_FINISHED:
                # consume result to remove from storage
                result = huey.result(event['id'])
                # remove huey id from my task status - inidicates the task finished - my task will be shown to user 
                status = WorkflowProcessStatuses.query.filter_by(huey_id=event['id']).first()
                if status:
                    status.huey_id = None
                    db.session.add(status)
                    db.session.commit()

但是这样做意味着这样的任务只需要运行一次 - 因为它永远消耗了一个工人 - 很快就会有更多的自由工人。我从上面开始get_huey_events任务,而create app factory就像这样运行:

with app.app_context():
    task1 = HueyTask.query.filter_by(name='queuecmd_get_huey_events').first()
    pipe = redis.StrictRedis()
    if task1:
        exists = pipe.hexists('huey.tasks', task1.id)
    else:
        exists = 0
    if task1 is None or not exists:
        if task1 and not exists:
            #clean old task if not running now
            pipe.hdel('huey.tasks', task1.id)
            db.session.delete(task1)
            db.session.commit()
        result = get_huey_events()
        pipe.hset('huey.tasks',result.task.task_id,'Event listener')

因此,我获取了存储的g​​et_huey_events huey任务的id,并查看它是否存储在我的自定义创建的huey.tasks名称中的redis数据库中,并带有task.id键。如果数据库中有任务但没有redis,或者数据库中没有任务,那么我运行事件监听器,否则不运行。

我的问题是 - 有更好的方法吗?事件监听器本身应该是一个huey.task吗?我现在在Windows下运行它。

1 个答案:

答案 0 :(得分:0)

如果愿意,您可以启动常规旧线程来运行事件侦听器。它不需要成为一项任务。