相关疑难解决方法(0)

Python asyncio:未引用的任务被垃圾收集器销毁?

我正在编写一个程序,它通过 AMQP 接受 RPC 请求以执行网络请求 (CoAP)。处理 RPC 请求时,aioamqp 回调会生成负责网络 IO 的任务。这些任务可以被视为后台任务,它们将无限期地运行以通过 AMQP 流式传输网络响应(在这种情况下,一个 RPC 请求会触发 RPC 响应和数据流)。

我注意到,在我的原始代码中,网络任务将在看似随机的时间间隔后(在完成之前)被销毁,asyncio 然后会打印以下警告“任务已被销毁但正在挂起”。此问题与此处描述的问题类似:https://bugs.python.org/issue21163

现在,我通过在模块级列表中存储硬引用来规避这个问题,这可以防止 GC 破坏任务对象。但是,我想知道是否有更好的解决方法?理想情况下,我想在 RPC 回调中调用等待任务,但我注意到这会阻止任何进一步的 AMQP 操作完成 -> 例如,创建新的 amqp 通道会停止,并且通过 amqp 接收 rpc 请求也会停止。然而,我不确定是什么导致了这种停顿(因为回调本身就是一个协程,我希望等待不会停顿整个 aioamqp 库)。

我在下面发布了 RPC 客户端和服务器的源代码,两者都基于 aioamqp/aiocoap 示例。在服务器中,on_rpc_request是 amqp rpc 回调,而send_coap_obs_request是网络协程,当删除“ obs_tasks.append(task) ”语句时,该协程会被销毁。

客户端.py:

"""
    CoAP RPC client, based on aioamqp implementation of RPC examples from RabbitMQ tutorial
"""

import base64
import json
import uuid

import asyncio
import aioamqp


class CoAPRpcClient(object): …
Run Code Online (Sandbox Code Playgroud)

python asynchronous python-asyncio

8
推荐指数
1
解决办法
2728
查看次数

标签 统计

asynchronous ×1

python ×1

python-asyncio ×1