我嘗試將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下運行它。