Celery First Steps - timeout error on result.get()
我在这里遵循Celery第一步指南:http://celery.readthedocs.org/en/latest/getting-started/first-steps-with-celery.html#keeping-results
我将继续使用RabbitMQ进行本教程。
当我执行result.get(timeout = 1)时,即使它是一个简单的添加操作,也显示超时错误,并且我可以看到工作程序正在运行并在另一个程序中产生正确的结果(共8个)窗口
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 | (venv) C:\\Volt\\celerytest>ipython Python 2.7.6 (default, Nov 10 2013, 19:24:18) [MSC v.1500 32 bit (Intel)] Type"copyright","credits" or"license" for more information. IPython 2.1.0 -- An enhanced Interactive Python. ? -> Introduction and overview of IPython's features. %quickref -> Quick reference. help -> Python's own help system. object? -> Details about 'object', use 'object??' for extra details. In [1]: from tasks import add In [2]: a = add(1,3) In [3]: a Out[3]: 4 In [4]: a = add.delay(1,3) In [5]: a.ready() Out[5]: False In [6]: a = add.delay(4,4) In [7]: a.get(timeout=0.5) --------------------------------------------------------------------------- TimeoutError Traceback (most recent call last) <ipython-input-7-2c407a92720e> in <module>() ----> 1 a.get(timeout=0.5) C:\\Users\\Som\\Envs\\venv\\lib\\site-packages\\celery\ esult.pyc in get(self, timeout, propagate, interval, no_ack, follow_parents) 167 interval=interval, 168 on_interval=on_interval, --> 169 no_ack=no_ack, 170 ) 171 finally: C:\\Users\\Som\\Envs\\venv\\lib\\site-packages\\celery\\backends\\amqp.pyc in wait_for(se lf, task_id, timeout, cache, propagate, no_ack, on_interval, READY_STATES, PROPA GATE_STATES, **kwargs) 155 on_interval=on_interval) 156 except socket.timeout: --> 157 raise TimeoutError('The operation timed out.') 158 159 if meta['status'] in PROPAGATE_STATES and propagate: TimeoutError: The operation timed out. In [8]: |
tasks.py文件
1 2 3 4 5 6 7 8 | from celery import Celery app = Celery('tasks', backend='amqp', broker='amqp://') @app.task def add(x, y): return x + y |
工人日志
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | [tasks] . tasks.add [2014-07-17 13:00:33,196: INFO/MainProcess] Connected to amqp://guest:**@127.0.0 .1:5672// [2014-07-17 13:00:33,211: INFO/MainProcess] mingle: searching for neighbors [2014-07-17 13:00:34,220: INFO/MainProcess] mingle: all alone [2014-07-17 13:00:34,240: WARNING/MainProcess] celery@SomsPC ready. [2014-07-17 13:00:34,242: INFO/MainProcess] Received task: tasks.add[85ff75d8-38 b5-442a-a574-c8b976a33739] [2014-07-17 13:00:34,243: INFO/MainProcess] Task tasks.add[85ff75d8-38b5-442a-a5 74-c8b976a33739] succeeded in 0.000999927520752s: 4 [2014-07-17 13:00:46,582: INFO/MainProcess] Received task: tasks.add[49de7c6b-96 72-485d-926e-a4e564ccc89a] [2014-07-17 13:00:46,588: INFO/MainProcess] Task tasks.add[49de7c6b-9672-485d-92 6e-a4e564ccc89a] succeeded in 0.00600004196167s: 8 |
经过" Celery第一步"后,我遇到完全相同的问题。
我认为建议这样做的原因
对我有用的设置如下:
1 2 | app = Celery('tasks', broker='amqp://guest@localhost//') app.conf.CELERY_RESULT_BACKEND = 'db+sqlite:///results.sqlite' |
根据文档,使用AMQP结果后端时,每个结果只能检索一次(实际上是查询中的一条消息)。
我想,您的工作进程检索它以便将结果打印到控制台:
因此您无法再次检索相同的结果。
如果您查看此线程,则似乎设置
有时我还会收到带有Redis的
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | celery_app.update( redis_socket_timeout=5, redis_socket_connect_timeout=5, ) def run_task(task, *args, **kwargs): timeout = 2 * 60 future = task.apply_async(args, kwargs) time_end = time.time() + timeout while True: try: return future.get(timeout=timeout) except redis.TimeoutError: if time.time() < time_end: continue raise |