RuntimeError:从不在任务中调用result.get()

2024-09-24 00:23:47 发布

您现在位置:Python中文网/ 问答频道 /正文

我的任务(检查Sberbank中的付款状态。如果没有捕获-重试检查):

from ....celeryconf import app
from . import client as sberbank
from ...models import Payment, Transaction


@app.task(bind=True, default_retry_delay=60, time_limit=1200)
def check_status_sberbank_task(self, order_id, connection_params):
    sberbank_client = sberbank.Client(auth=(connection_params['login'], connection_params['password']),
                                      sandbox=connection_params['sandbox_mode'])

    response = sberbank_client.payment.get_status(order_id=order_id)

    txn = Transaction.objects.get(token=order_id)
    if response['actionCode'] == 0:

        txn.is_success = True
        txn.save()

        payment = Payment.objects.get(pk=txn.payment_id)
        payment.charge_status = 'fully-charged'
        payment.captured_amount = payment.total
        payment.save()

        return 'Success pay on Sberbank for ' + str(order_id)
    else:
        self.retry(countdown=60)

在日志文件中,我有:

ERROR celery.app.trace Task saleor.payment.gateways.sberbank.tasks.check_status_sberbank_task[bb384815-4a5b-49d7-bc29-114707f072b1] raised unexpected: RuntimeError('Never call result.get() within a task!\nSee http://docs.celeryq.org/en/latest/userguide/tasks.html#task-synchronous-subtasks\n',) [PID:26869:Thread-825]

Traceback (most recent call last): File "/home/korolev/saleor/lib/python3.6/site-packages/celery/app/trace.py", line 385, in trace_task R = retval = fun(*args, **kwargs) File "/home/korolev/saleor/saleor/payment/gateways/sberbank/tasks.py", line 26, in check_status_sberbank_task self.retry(countdown=60) File "/home/korolev/saleor/lib/python3.6/site-packages/celery/app/task.py", line 715, in retry S.apply().get() File "/home/korolev/saleor/lib/python3.6/site-packages/celery/result.py", line 1015, in get assert_will_not_block() File "/home/korolev/saleor/lib/python3.6/site-packages/celery/result.py", line 41, in assert_will_not_block raise RuntimeError(E_WOULDBLOCK)

RuntimeError: Never call result.get() within a task! See http://docs.celeryq.org/en/latest/userguide/tasks.html#task-synchronous-subtasks

如何修复此错误


Tags: pyidapphometaskgetstatusline