尝试使用线程从列表中删除全局对象,del 函数不起作用

问题描述 投票:0回答:1

我正在用 python 编写一个服务器,并尝试使用与最初将对象存储在列表中的线程不同的线程来删除全局缓存对象的列表。当我调用 del 时,它实际上并没有删除对象,在检查引用计数后,它返回 2032 个引用。

程序关闭后我将调用 del 函数并且它可以正常工作。然而,当尝试在运行中执行此操作时,它似乎不起作用(大概是因为它有 2032 个引用)。我想知道我尝试从列表中删除是否错误,或者是否有更好的方法来删除/存储缓存的对象。

这是我的维护缓存函数,它在我的第二个线程上运行。删除前后缓存的聊天记录和用户数保持不变。

# maintains the server cache, deleting and refreshing objects as needed
def maintainCache():
    global serverRunning
    start = time.monotonic()
    while (serverRunning):
        time.sleep(30.0 - ((time.monotonic() - start) % 30.0))
        print("Deleting cache...")
        print(f"Active chats: {getNumberOfCachedChats()}")
        print(f"Active users: {getNumberOfCachedUsers()}")
        deleteCachedUserObjects()
        deleteCachedChats()
        print(f"Active chats: {getNumberOfCachedChats()}")
        print(f"Active users: {getNumberOfCachedUsers()}")

两个deleteCached 函数是相同的。这是其中之一。我确实尝试在运行 for 循环之前指定全局,但这似乎没有改变任何东西。

def deleteCachedUserObjects():
    for user in userList:
        del user
python-3.x multithreading garbage-collection del
1个回答
0
投票

del user
不是函数。这是一个语句
user
中的操作数
del user
是一个l值

del user
不会对
user
引用的对象执行任何操作,并且不会对恰好包含对同一对象的引用的任何列表执行任何操作。它的作用是,它实际上破坏了 局部变量,
user

del userList[i]
would 通过删除第
userList
元素来更改
i
。因此,如果您想让列表为空,您可以这样做:

    while len(userList) > 0:
        del userList[0]
© www.soinside.com 2019 - 2024. All rights reserved.