python - python中的Celery构建微服务

标签 python python-3.x celery microservices celerybeat

我想将一个项目分解为小型微服务。我一直在考虑 gRPC 等不同的工具,但我认为 celery 对我来说可能是更好的选择。如果我错了并且 celery 不是一个好的选择,请告诉我原因。

我到底想做什么?

  • 例如,我有三个不同的服务器,A、B 和 C。“A”必须能够向“B”发送请求。 “B”必须一直在听。
  • “B”从“A”获取请求,对其进行处理,然后它必须能够向“C”发送请求。
  • “C”根据“B”的给定请求执行一些操作,然后必须将结果返回给“B”。
  • “B”对结果进行处理,完成后必须将结果返回给“A”。

我做了什么?

  • 我创建了两台 RabbitMQ 服务器,一台用于“A”和“B”,另一台用于“B”和“C”。
  • 我使用 send_task 将任务发送到服务器。一项任务是将字符串从“A”发送到“B”。 “B”已经在监听并等待来自“A”的请求。 “B”上还有另一个 send_task,它向“C”发送请求。 “C”也已经在运行并等待来自“B”的请求。
  • 我使用 backend='rpc' 返回结果。

当“A”发送请求时,“B”接收该请求并将send_task发送给“C”。 “C”也毫无问题地接收到请求。问题是返回结果。 我尝试了不同的方法,但大多遇到了 runtimeError: Never call result.get() inside a task Celery 错误。

有人有解决办法吗?

最佳答案

此特定错误表明在任务中使用 result.get() 是一种不好的做法,可能会导致死锁。

如果您知道自己在做什么,可以尝试 allow_join_result但这可能会导致性能问题:

with allow_join_result():
    task.get()

您也可以等待任务成功:

timeout = 0.1
while not result.ready():
    time.sleep(timeout)

ret = result.get()

关于python - python中的Celery构建微服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73121342/

相关文章:

Python Selenium --user-data-dir 选项错误 : could not remove old devtools port file

java - Selenium 使用太多内存

django - celery :无法连接到rabbitmq

python - 如何设置 x&y 轴的对数刻度?

python - SQLAlchemy 在 celery 任务中返回陈旧数据

celery - Airflow 调度程序抛出错误 - 'DisabledBackend' 对象没有属性 '_get_task_meta_for'

php - RasPi上php5与mysql连接错误

python - 强制python打印整个数字

python - 根据某些列名称对不同数据帧中的列求和

python - 在 openCV 中如何从 python 中的 opencv_createsamples 生成的矢量文件加载图像?