Using celeryd as a daemon with multiple django apps?

后端 未结 2 1145
难免孤独
难免孤独 2021-02-05 07:14

I\'m just starting using django-celery and I\'d like to set celeryd running as a daemon. The instructions, however, appear to suggest that it can be configured for only one site

相关标签:
2条回答
  • 2021-02-05 07:57

    Did not try but using Celery 3.1.x which does not need django-celery, according to the documentation you can instantiate a Celery app like this:

    app1 = Celery('app1')
    
    app1.config_from_object('django.conf:settings')
    app1.autodiscover_tasks(lambda: settings.INSTALLED_APPS)
    
    
    @app.task(bind=True)
    def debug_task(self):
        print('Request: {0!r}'.format(self.request))
    

    But you can use celery multi for launching several workers with single configuration each, you can see examples here. So you can launch several workers with different --app appX parameters so it will use different taks and settings:

    # 3 workers: Two with 3 processes, and one with 10 processes.
    $ celery multi start 3 -c 3 -c:1 10
    celery worker -n celery1@myhost -c 10 --config celery1.py --app app1
    celery worker -n celery2@myhost -c 3  --config celery2.py --app app2
    celery worker -n celery3@myhost -c 3  --config celery3.py --app app3
    
    0 讨论(0)
  • 2021-02-05 08:11

    Like all interesting questions, the answer is it depends. :)

    It is definitely possible to come up with a scenario in which celeryd can be used by two independent sites. If multiple sites are submitting tasks to the same exchange, and the tasks do not require access to any specific database -- say, they operate on email addresses, or credit card numbers, or something other than a database record -- then one celeryd may be sufficient. Just make sure that the task code is in a shared module that is loaded by all sites and the celery server.

    Usually, though, you'll find that celery needs access to the database -- either it loads objects based on the ID that was passed as a task parameter, or it has to write some changes to the database, or, most often, both. And multiple sites / projects usually don't share a database, even if they share the same apps, so you'll need to keep the task queues separate .

    In that case, what will usually happen is that you set up a single message broker (RabbitMQ, for example) with multiple exchanges. Each exchange receives messages from a single site. Then you run one or more celeryd processes somewhere for each exchange (in the celery config settings, you have to specify the exchange. I don't believe celeryd can listen to multiple exchanges). Each celeryd server knows its exchange, the apps it should load, and the database that it should connect to.

    To manage these, I would suggest looking into cyme -- It's by @asksol, and manages multiple celeryd instances, on multiple servers if necessary. I haven't tried, but it looks like it should handle different configurations for different instances.

    0 讨论(0)
提交回复
热议问题