python-3.x - 使用异步队列时重复的 python id
问题描述
我无法理解为什么我会获得异步队列的重复 ID,我无法理解为什么其中一些具有重复的对象 ID。
我正在使用 python3.6.7
#######REPRODUCIBLE CODE#######
from asyncio import Queue, LifoQueue
class System:
def __init__(self, system_name):
self.app = {}
self.app['event_queue'] = self.build_queue('fifo')
self.app['heartbeat_queue'] = self.build_queue('fifo')
def build_queue(self, consumer_queue_strategy):
if consumer_queue_strategy == 'fifo':
return Queue()
if consumer_queue_strategy == 'lifo':
return LifoQueue()
raise ValueError(f'Invalid queue strategy "{consumer_queue_strategy}"')
for dv_system in [('UATDSG'),('UATVAIBHAV'),('UATP114271571'),('UATORION18')]:
system_name = dv_system
sys = System(system_name)
print(system_name,'HB Q',id(sys.app['heartbeat_queue']))
print(system_name,'SYS Q',id(sys.app['event_queue']))
OUT===>
UATDSG HB Q 4410129656
UATDSG SYS Q 4410129488
UATVAIBHAV HB Q 4409567608
UATVAIBHAV SYS Q 4409568000
UATP114271571 HB Q 4410129488
UATP114271571 SYS Q 4410129656
UATORION18 HB Q 4409568000
UATORION18 SYS Q 4409567608
Artemiy Rodionov 我做了以下,但我没有得到正确的结果,
systems = []
# for dv_system in loop.run_until_complete(get_all_routerbound_allowed_systems_on_init(app)):
for dv_system in [('UATDSG'),('UATVAIBHAV'),('UATP114271571'),('UATORION18')]:
system_name = dv_system
systems.append(System(app, system_name))
for sys in systems:
print(id(sys),'HB Q',id(sys.app['heartbeat_queue']))
print(id(sys),'SYS Q',id(sys.app['event_queue']))
哪个记录以下内容,其中对象不同但指的是相同的队列对象?
4493695632 HB Q 4493695856
4493695632 SYS Q 4493695744
4493695912 HB Q 4493695856
4493695912 SYS Q 4493695744
4493695800 HB Q 4493695856
4493695800 SYS Q 4493695744
4493695688 HB Q 4493695856
4493695688 SYS Q 4493695744
解决方案
CPythonid
使用内存位置作为对象 id,因此对象的 id 仅在对象的生命周期内是唯一的。在对象被销毁后,其他东西可以具有相同的 id。
您可以查看此问题以了解详细信息。
在您的情况下System
,实例的生命周期太短,受迭代限制,因此它们具有相同的 ID。
System
具有不同生命周期的实例具有唯一的 ID。你可以检查它:
from asyncio import Queue, LifoQueue
class System:
def __init__(self, system_name):
self.app = {}
self.app['event_queue'] = self.build_queue('fifo')
self.app['heartbeat_queue'] = self.build_queue('fifo')
def build_queue(self, consumer_queue_strategy):
if consumer_queue_strategy == 'fifo':
return Queue()
if consumer_queue_strategy == 'lifo':
return LifoQueue()
raise ValueError(f'Invalid queue strategy "{consumer_queue_strategy}"')
systems = []
for dv_system in [('UATDSG'),('UATVAIBHAV'),('UATP114271571'),('UATORION18')]:
system_name = dv_system
systems.append(System(system_name))
for sys in systems:
print(system_name,'HB Q',id(sys.app['heartbeat_queue']))
print(system_name,'SYS Q',id(sys.app['event_queue']))
推荐阅读
- python - 如何在xml中添加多个标签?
- sql - SQL Server - 创建返回扁平值的内部 JSON 查询
- javascript - 在 IE 上使用 Selection.getRangeAt 时出现“IndexSizeError”
- visual-c++ - 注册设备通知
- python - python中使用gpu加速库的n维滑动窗口操作,最好是Tensorflow?
- python-3.x - seaborn 2d kde图中的自定义最大和最小比例
- reactjs - 对 react-navigation 的引用在导入时会引发错误。我需要 webpack 吗?
- assembly - 汇编中的`js`和`jb`指令
- reactjs - 在反应中渲染来自 API 调用的 JSON 数据
- javascript - 使用 RequestAnimationFrame() 绘制线条