Django - Celery Worker - 频道

Posted

技术标签:

【中文标题】Django - Celery Worker - 频道【英文标题】:Django - Celery Worker - Channels 【发布时间】:2021-12-22 07:33:01 【问题描述】:

提前谢谢你

我正在尝试启动一个 Celery Worker 以接受使用频道的 WebConnections - 但是当我的工人启动时,它似乎无法找到频道。当我安装 pip 列表频道时

settings.py 有频道

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'channels','

tasks.py

from __future__ import absolute_import, unicode_literals
import os
import threading
from merlin.celery import app, get_blender
from django.conf import settings
from celery import shared_task
from channels import Channel

@app.task(bind=True, track_started=True)
def render(task, data, reply_channel):
    bpy = get_blender()
    setup_scene(bpy, data)

context = 'rendering': True, 'filepath': os.path.join(settings.BLENDER_RENDER_TMP_DIR, task.request.id)
sync_thread = threading.Thread(target=sync_render, args=(bpy, context, reply_channel))
sync_thread.start()
bpy.ops.render.render()
context['rendering'] = False
sync_thread.join()

if os.path.exists(context['filepath']):
    os.remove(context['filepath'])

if reply_channel is not None:
    Channel(reply_channel).send(
        'text': json.dumps(
            'action': 'render_finished'
        )
    )'

我得到的错误 -

from channels import Channel
ImportError: cannot import name 'Channel' from 'channels' 
(/usr/local/lib/python3.8/dist-packages/channels/__init__.py)

再次提前感谢您

【问题讨论】:

是的,包已安装,Python 正在尝试从那里导入;没有配置问题。 (有时人们试图在他们自己的项目中拥有一个名为 channels.py 的文件,而不是库,而是导入该文件。)正如错误消息清楚地解释的那样,问题是 Channel 不是可以@的东西987654327@edfrom channels。对于此类问题,您应该首先尝试阅读理解错误消息,然后咨询documentation 感谢您的指导 - 我确实查阅了文档并阅读了错误 - 过去和现在都缺乏经验和理解。我一直在假设我的工人没有可用的频道。谢谢。 【参考方案1】:

See the documentation for using channel layers outside of consumers

from asgiref.sync import async_to_sync
from channels.layers import get_channel_layer
channel_layer = get_channel_layer()

@app.task(bind=True, track_started=True)
def render(task, data, reply_channel):
    ...
    async_to_sync(channel_layer.send)(reply_channel, 
        'type': 'this_is_required',
        'text': json.dumps(
            'action': 'render_finished'
        )
    )

You may want to consider using channel workers and background tasks

【讨论】:

谢谢你的帮助,我会试试这个 @JohnCapobianco 频道作品可以替代使用 celery channels.readthedocs.io/en/stable/topics/worker.html 我想让您知道您的建议有效 - 我现在有一条新的错误消息 - 但我已经超出了导入问题!感谢您的慷慨帮助。我真的很感谢你的时间。

以上是关于Django - Celery Worker - 频道的主要内容,如果未能解决你的问题,请参考以下文章

Celery在Django中的使用介绍

Django celery 4 - ValueError: int() 的无效文字,当启动 celery worker 时,基数为 10

让 django celery worker 在 elastic-beanstalk 上启动的问题

是否有人将 django celery worker 实现为 docker 容器,它仅在分配任务时运行

弹性 beantalk 中的 celery worker 出错(使用 django 和 SQS)[ImportError:curl 客户端需要 pycurl 库。]

django定时器_djcelery+mq的使用