Python Celery可以从进程中的线程开始?

时间:2013-06-16 15:06:05

标签: python celery

我想用我的芹菜代码制作一个测试用例。 但通常芹菜需要从像$ celery -A CELERY_MODULE worker这样的新进程开始,这意味着我无法直接运行我的测试用例代码?

我使用内存存储配置Celery以使测试用例中的额外I / O无效。那个配置无法在不同的进程中共享任务队列。

1 个答案:

答案 0 :(得分:0)

这是我天真的工具。 来自celery.bin.celeryd.WorkCommand的celery条目,它解析args并执行工作 使用solo使案例中的MultiProcess使用无效。当然你需要先安装lib。

您可以在芹菜测试用例开始之前使用它。

#!/usr/bin/env python
#vim: encoding=utf-8

import time
import unittest
from threading import Thread

from celery import Celery, states
from celery.bin.celeryd import WorkerCommand

class CELERY_CONFIG(object):
    BROKER_URL = "memory://"
    CELERY_CACHE_BACKEND = "memory"
    CELERY_RESULT_BACKEND = "cache"
    CELERYD_POOL = "solo"

class CeleryTestCase(unittest.TestCase):
    def test_inprocess(self):
        app = Celery(__name__)
        app.config_from_object(CELERY_CONFIG)

        @app.task
        def dumpy_task(dct):
            return 321

        worker = WorkerCommand(app)
        #worker.execute_from_commandline(["-P solo"])
        t = Thread(target=worker.execute_from_commandline, args=(["-c 1"],))
        t.daemon = True
        t.start()
        ar = dumpy_task.apply_async(({"a": 123},))
        while ar.status != states.SUCCESS:
            time.sleep(.01)
        self.assertEqual(states.SUCCESS, ar.status)
        self.assertEqual(ar.result, 321)
        t.join(0)