私は、フラスコのアプリケーションにpython hueyキューを組み込もうとしています。私は私のワークフローでタスクを実行するために使用し、タスクが実行されている間、私はそれをユーザーから隠します(huey.taskからデータベースのtaskstatusにtask_idを追加します)。そうでなければ、同じタスクが滞っているように見えますが、それはバックグラウンドで実行されています。python huey eventsを聞く - 一度リスナーを実行しますか?
今、面倒な作業は、ヒューイーな仕事が終わっている間に私の仕事を示すことです。私はイベントリスナー(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ですか?私は今のところ窓の下で走ります。