首页 > 解决方案 > 使用异步队列时重复的 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

标签: python-3.xpython-asyncio

解决方案


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']))

推荐阅读