簡體   English   中英

偵聽python huey事件-運行一次偵聽器?

[英]Listening to python huey events - run listener once?

我嘗試將python huey隊列合並到我的flask應用程序中,並且一切正常。 我用它在我的工作流中運行任務,並且在任務運行時,我向用戶隱藏了它(將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任務開始:

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名稱(使用task.id鍵)的redis數據庫中。 如果數據庫中有任務但redis中沒有任務,或者數據庫中沒有任務,那么我運行事件監聽器,否則就沒有。

我的問題是-有更好的方法嗎? 事件監聽器本身應該是huey.task嗎? 我現在在Windows下運行它。

如果需要,您可以僅啟動常規舊線程來運行事件偵聽器。 不必是任務。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM