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 - 频道的主要内容,如果未能解决你的问题,请参考以下文章
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 库。]