faq.rst 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. ============================
  2. Frequently Asked Questions
  3. ============================
  4. Questions
  5. =========
  6. MySQL is throwing deadlock errors, what can I do?
  7. -------------------------------------------------
  8. **Answer:** MySQL has default isolation level set to ``REPEATABLE-READ``,
  9. if you don't really need that, set it to ``READ-COMMITTED``.
  10. You can do that by adding the following to your ``my.cnf``::
  11. [mysqld]
  12. transaction-isolation = READ-COMMITTED
  13. For more information about InnoDBs transaction model see `MySQL - The InnoDB
  14. Transaction Model and Locking`_ in the MySQL user manual.
  15. (Thanks to Honza Kral and Anton Tsigularov for this solution)
  16. .. _`MySQL - The InnoDB Transaction Model and Locking`: http://dev.mysql.com/doc/refman/5.1/en/innodb-transaction-model.html
  17. celeryd is not doing anything, just hanging
  18. --------------------------------------------
  19. **Answer:** See `MySQL is throwing deadlock errors, what can I do?`_.
  20. I'm having ``IntegrityError: Duplicate Key`` errors. Why?
  21. ----------------------------------------------------------
  22. **Answer:** See `MySQL is throwing deadlock errors, what can I do?`_.
  23. Thanks to howsthedotcom.
  24. My Periodic Tasks won't run
  25. ----------------------------
  26. **Answer:** Did you register the task in the applications ``tasks.py`` module?
  27. (or in some other module Django loads by default, like ``models.py``?).
  28. You can find out if the celery daemon is able to run the task by executing the
  29. periodic task manually:
  30. >>> from myapp.tasks import MyPeriodicTask
  31. >>> MyPeriodicTask.delay()
  32. Watch celery daemons logfile (or output if not running as a daemon), to see
  33. if it's able to find the task, or if some other error is happening.
  34. Can I send some tasks to only some servers?
  35. --------------------------------------------
  36. As of now there is only one use-case that works like this, and that is
  37. tasks of type ``A`` can be sent to servers ``x`` and ``y``, while tasks
  38. of type ``B`` can be sent to server ``z``. One server can't handle more than
  39. one routing_key, but this is coming in a later release.
  40. Say you have two servers, ``x``, and ``y`` that handles regular tasks,
  41. and one server ``z``, that only handles feed related tasks, you can use this
  42. configuration:
  43. * Servers ``x`` and ``y``: settings.py:
  44. .. code-block:: python
  45. AMQP_SERVER = "rabbit"
  46. AMQP_PORT = 5678
  47. AMQP_USER = "myapp"
  48. AMQP_PASSWORD = "secret"
  49. AMQP_VHOST = "myapp"
  50. CELERY_AMQP_CONSUMER_QUEUE = "regular_tasks"
  51. CELERY_AMQP_EXCHANGE = "tasks"
  52. CELERY_AMQP_PUBLISHER_ROUTING_KEY = "task.regular"
  53. CELERY_AMQP_CONSUMER_ROUTING_KEY = "task.#"
  54. CELERY_AMQP_EXCHANGE_TYPE = "topic"
  55. * Server ``z``: settings.py:
  56. .. code-block:: python
  57. AMQP_SERVER = "rabbit"
  58. AMQP_PORT = 5678
  59. AMQP_USER = "myapp"
  60. AMQP_PASSWORD = "secret"
  61. AMQP_VHOST = "myapp"
  62. CELERY_AMQP_CONSUMER_QUEUE = "feed_tasks"
  63. CELERY_AMQP_EXCHANGE = "tasks"
  64. CELERY_AMQP_PUBLISHER_ROUTING_KEY = "task.regular"
  65. CELERY_AMQP_CONSUMER_ROUTING_KEY = "task.feed.#"
  66. CELERY_AMQP_EXCHANGE_TYPE = "topic"
  67. Now to make a Task run on the ``z`` server you need to set its
  68. ``routing_key`` attribute so it starts with the words ``"task.feed."``:
  69. .. code-block:: python
  70. from feedaggregator.models import Feed
  71. from celery.task import Task
  72. class FeedImportTask(Task):
  73. name = "import_feed"
  74. routing_key = "task.feed.importer"
  75. def run(self, feed_url):
  76. # something importing the feed
  77. Feed.objects.import_feed(feed_url)
  78. You can also override this using the ``routing_key`` argument to
  79. :func:`celery.task.apply_async`:
  80. >>> from celery.task import apply_async
  81. >>> from myapp.tasks import RefreshFeedTask
  82. >>> apply_async(RefreshFeedTask, args=["http://cnn.com/rss"],
  83. ... routing_key="task.feed.importer")