芹菜Gevent Pool ConcurrentObjectUseE

2024-05-05 10:42:29 发布

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

{1}使用另一个具有cd1>任务池的芹菜添加了一个请求。在

我使用Django,RabbitMQ作为代理,Redis作为芹菜结果后端,celery4.1.0。在

任务有ignore_result=True,但我经常遇到这个错误ConcurrentObjectUseError: This socket is already used by another greenlet: <bound method Waiter.switch of <gevent.hub.Waiter...>

我看这和Redis连接有关。在

我想不出怎么解决这个问题。 这或多或少就是任务的逻辑。 我也试着在调用process_task.apply_async时使用信号量,但是没有用。在

from gevent.lock import BoundedSemaphore

sem = BoundedSemaphore(1)


@app.task(ignore_result=True, queue='request_queue')
def request_task(url, *args, **kwargs):
    # make the request
    req = requests.get(url)

    request = {
        'status_code': req.status_code,
        'content': req.text,
        'headers': dict(req.headers),
        'encoding': req.encoding
    }
    with sem:
        process_task.apply_async(kwargs={'url': url, 'request': request})
    print(f'Done - {url}')

这是堆栈跟踪:

^{pr2}$

Tags: redistrueurltaskasyncrequestgeventresult
1条回答
网友
1楼 · 发布于 2024-05-05 10:42:29

我不确定这是否是正确的答案,但是通过设置celeri_RESULT_BACKEND=None,我就不再看到这个错误了。在

我希望能帮上忙。在

仅供参考,此错误仅在使用gevent池时发生。我尝试过的芹菜版本:3.1、4.2.1。在

相关问题 更多 >