2017-10-06 117 views
0

我嘗試將python huey隊列合併到我的燒瓶應用程序中,並且我完成了所有工作。我使用它在我的工作流中運行任務,並且在任務運行時,將它從用戶隱藏(將huey.task中的task_id添加到數據庫中的taskstatus中) - 否則,看起來同樣的任務會卡住,但實際上它在後臺運行。收聽python huey事件 - 運行偵聽器一次?

現在棘手的部分是在huey任務完成時顯示我的任務。我整合了事件監聽器(通過huey.storage迭代),就像huey文檔一樣,但是從我理解的它所訂閱的redis中無限期運行(因爲有定期任務檢查)。所以,從我瞭解的事件監聽器本身必須在單獨的線程中運行,所以我寫了休伊任務聽休伊任務:

@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() 

但把這樣的說法意味着,這樣的任務只需要運行一次 - 因爲它永遠消耗一名工人 - 很快就不會有更多的自由工人。

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') 

,所以我得到我的存儲get_huey_events的休伊任務ID,看看它是否被存儲在Redis的數據庫在我的自定義與創建huey.tasks名:在創建應用工廠運行這樣我開始上述get_huey_events任務task.id鍵。如果在數據庫中有任務,但不在redis中,或者數據庫中沒有任何任務,那麼我運行事件偵聽器,否則不會。

我的問題是 - 有沒有更好的方法來做到這一點?事件監聽器本身應該是huey.task嗎?我現在在windows下運行它。

回答

0

如果願意,您可以啓動一個普通的舊線程來運行事件偵聽器。它不需要成爲一項任務。