AS3中SharedObject的send用法

本文介绍了在ActionScript3中如何通过设置客户端回调函数实现与Flash Media Server(FMS)的数据交换。为了确保与FMS-AS1模式兼容, 采用了一种特定的方法来发送和接收数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

    ActionScript3中,事件注册/广播回调机制已经完全摒弃了AS1/2的匿名函数回调的方式。但是由于在与FMS交互相关的部分涉及与FMS-AS的AS1模式交互。所以需要注意使用方式。
   
    so = SharedObject.getRemote('test',nc.uri);      // 连接远程SO
    ...
    so.client = new Object();   // AS3的client为AS1事件回调兼容预备
    so.client.soReceiveHandler = soReceiveHandler;  // 在client建立回调
    ...
    private function soReceiveHandler(oData):void{   // 定义回调
        trace('synced!',oData.x,oData.y);
        var mc:WaterPoint = new WaterPoint();
        mc.x = oData.x;
        mc.y = oData.y;
        addChild(mc);
    }
    ...
    so.send('soReceiveHandler',{x:mouseX,y:mouseY});   //发送消息

 

摘自:城市拓荒者http://blog.tom.com/wibrst/article/542.html

### DRF中Celery无法异步执行的原因及解决方案 在Django Rest Framework (DRF) 中使用 Celery 执行异步任务时,如果发现任务未能以异步方式运行,可能是由于以下几个原因导致的: #### 1. Celery Worker未正确启动 确保 Celery Worker 已经正确启动并且正在运行。如果 Worker 没有启动或配置错误,任务将不会被发送到队列中执行,而是直接同步运行[^1]。 - 在 Windows 环境下可以使用 `eventlet` 启动 Worker: ```bash pip install eventlet celery -A mycelery.main worker --loglevel=info -P eventlet ``` - 在 Linux 环境下可以直接启动 Worker: ```bash celery -A mycelery.main worker --loglevel=info ``` #### 2. Celery Broker 配置问题 Celery 使用消息队列(如 Redis 或 RabbitMQ)作为 Broker 来传递任务信息。如果 Broker 配置不正确或连接失败,任务将无法进入队列并异步执行。需要检查以下内容: - 确保 Broker URL 在 `settings.py` 中正确配置: ```python CELERY_BROKER_URL = 'redis://localhost:6379/0' ``` - 如果 Redis 服务未启动或地址配置错误,会导致任务无法异步执行[^4]。 #### 3. 任务未正确调用 `.delay()` 或 `.apply_async()` 在 DRF 的视图中调用 Celery 任务时,必须使用 `.delay()` 或 `.apply_async()` 方法来触发异步执行。如果直接调用任务函数(如 `tasks.send_msg("hello")`),任务将以同步方式运行[^3]。 正确的调用方式如下: ```python from celery_tasks.async_task import tasks def post(self, request): ret = tasks.send_msg.delay("hello") return Response({"status": "OJBK", "id": ret.id}) ``` #### 4. Django 和 Celery 的集成问题 确保 Celery 应用程序与 Django 项目正确集成。在 `celery.py` 文件中,应包含以下代码以确保 Celery 能够加载 Django 设置: ```python import os from celery import Celery os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'your_project.settings') app = Celery('your_project') app.config_from_object('django.conf:settings', namespace='CELERY') app.autodiscover_tasks() ``` 此外,在 `__init__.py` 文件中导入 Celery 应用实例以避免延迟加载问题: ```python from .celery import app as celery_app __all__ = ('celery_app',) ``` #### 5. 异步任务状态检查逻辑问题 在 DRF 视图中,如果需要检查任务状态,可以使用 `AsyncResult` 类。但如果任务 ID 无效或状态未正确更新,可能导致任务状态检查失败[^3]。例如: ```python from celery.result import AsyncResult class TaskStatusView(APIView): def get(self, request): task_id = request.data.get('id') async_result = AsyncResult(id=task_id, app=app) if async_result.successful(): return Response({"result": async_result.get()}) elif async_result.failed(): return Response({"error": "Task failed"}) else: return Response({"status": "Task pending"}) ``` #### 6. 异步IO支持问题 如果 Django 项目未启用异步支持,可能会导致某些任务无法正确异步执行。可以通过设置 `ASGI` 服务器和启用异步中间件来解决此问题[^4]。 --- ### 示例代码 以下是一个完整的 DRF + Celery 集成示例: **`celery.py`** ```python import os from celery import Celery os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'your_project.settings') app = Celery('your_project') app.config_from_object('django.conf:settings', namespace='CELERY') app.autodiscover_tasks() ``` **`__init__.py`** ```python from .celery import app as celery_app __all__ = ('celery_app',) ``` **`tasks.py`** ```python from celery import shared_task @shared_task def send_msg(message): print(f"Message sent: {message}") return f"Sent: {message}" ``` **`views.py`** ```python from rest_framework.views import APIView from rest_framework.response import Response from celery_tasks.tasks import send_msg class TestView(APIView): def post(self, request): message = request.data.get('message', 'default') result = send_msg.delay(message) return Response({"status": "Task created", "task_id": result.id}) ``` --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

游鱼_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值