我正在编写一个程序,它通过 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) 给出以下模型:(不要介意TextFields只是为了说明)
class Base(models.Model):
field1 = models.TextField()
class Meta:
abstract=True
class Child1(Base):
child1_field = models.TextField()
class Child2(Base):
child2_field = models.TextField()
class Content(models.Model):
aso_items = models.ManyToManyField('Base')
Run Code Online (Sandbox Code Playgroud)
根据这些定义,Content对象可以与多个Base对象相关联,例如.面试(=内容对象)可以与音乐家(= Child1对象),电影导演(= Child2)等联系.
现在,对于我的问题:是否可以根据aso_items字段指向的模型过滤Content对象?例如:假设我想要一个Queryset,其中包含与Child1的特定对象相关联的所有Content对象(例如,与音乐家Bob Dylan相关的所有访谈),我该如何实现?
此外,如果我想要一个包含与Child1对象相关的所有Content对象的QuerySet,那该怎么办?(例如,所有与音乐家相关的访谈)如何改变过滤?
在此先感谢ps:我在预览中遇到了一些空白问题,原谅我