瀏覽代碼

implement better queue syncing logic

version-14
Pratik Vyas 11 年之前
父節點
當前提交
ae2fc7ada2
共有 1 個文件被更改,包括 35 次插入10 次删除
  1. +35
    -10
      frappe/tasks.py

+ 35
- 10
frappe/tasks.py 查看文件

@@ -4,7 +4,7 @@
from __future__ import unicode_literals from __future__ import unicode_literals
import frappe import frappe
from frappe.utils.scheduler import enqueue_events from frappe.utils.scheduler import enqueue_events
from frappe.celery_app import get_celery, celery_task, task_logger, get_queue, LONGJOBS_PREFIX
from frappe.celery_app import get_celery, celery_task, task_logger, LONGJOBS_PREFIX
from frappe.cli import get_sites from frappe.cli import get_sites
from frappe.utils.file_lock import delete_lock from frappe.utils.file_lock import delete_lock


@@ -14,21 +14,20 @@ def sync_queues():
app = get_celery() app = get_celery()
shortjob_workers, longjob_workers = get_workers(app) shortjob_workers, longjob_workers = get_workers(app)


for site in get_sites():
if shortjob_workers:
app.control.broadcast('add_consumer', arguments=get_queue(site),
reply=True, destination=shortjob_workers)
if longjob_workers:
app.control.broadcast('add_consumer', arguments=get_queue(site, LONGJOBS_PREFIX),
reply=True, destination=longjob_workers)
if shortjob_workers:
for worker in shortjob_workers:
sync_worker(app, worker)
if longjob_workers:
for worker in longjob_workers:
sync_worker(app, worker, prefix=LONGJOBS_PREFIX)
def get_workers(app): def get_workers(app):
longjob_workers = [] longjob_workers = []
shortjob_workers = [] shortjob_workers = []


active_queues = app.control.inspect().active_queues() active_queues = app.control.inspect().active_queues()
for worker in active_queues.keys():
for worker in active_queues:
if worker.startswith(LONGJOBS_PREFIX): if worker.startswith(LONGJOBS_PREFIX):
longjob_workers.append(worker) longjob_workers.append(worker)
else: else:
@@ -36,6 +35,32 @@ def get_workers(app):
return shortjob_workers, longjob_workers return shortjob_workers, longjob_workers


def sync_worker(app, worker, prefix=''):
active_queues = set(get_active_queues(app, worker))
required_queues = set(get_required_queues(app, prefix=prefix))
to_add = required_queues - active_queues
to_remove = active_queues - required_queues
for queue in to_add:
app.control.broadcast('add_consumer', arguments={
'queue': queue
}, reply=True, destination=[worker])
for queue in to_remove:
app.control.broadcast('cancel_consumer', arguments={
'queue': queue
}, reply=True, destination=[worker])


def get_active_queues(app, worker):
active_queues = app.control.inspect().active_queues()
return [queue['name'] for queue in active_queues[worker]]

def get_required_queues(app, prefix=''):
ret = []
for site in get_sites():
ret.append('{}{}'.format(prefix, site))
ret.append(app.conf['CELERY_DEFAULT_QUEUE'])
return ret

@celery_task() @celery_task()
def scheduler_task(site, event, handler, now=False): def scheduler_task(site, event, handler, now=False):
from frappe.utils.scheduler import log from frappe.utils.scheduler import log


Loading…
取消
儲存