gpt4 book ai didi

python - 通过两个单独的线程访问全局字典返回不同的结果

转载 作者:太空宇宙 更新时间:2023-11-03 17:54:35 24 4
gpt4 key购买 nike

我在尝试访问将对象作为值保存的全局字典时遇到问题。

在代码中,一个线程 (TestAccess) 将监听 Web 连接并创建对象并更新其变量,为其分配一个键并插入到全局字典 (client_list) 相应地。而另一个线程 (data_cleaner) 将遍历此全局字典中的键列表并检查每个对象中的某些值,如果满足某些条件,则将删除对象。

我正在创建的对象 (clientObject) 在创建时会附加另一个对象 (deviceObject) - 只是让您知道。

当我运行两个线程时,应检查对象的线程 (data_cleaner) 将看不到正在更新的字典。它始终返回 {}。如果我在没有任何步骤的情况下运行这些函数,并且两者都按预期返回正确的字典值。

我尝试过 global 关键字,但没有成功。还添加了 Lock() 只是为了确保我们没有任何同时资源访问问题。

有人可以解释一下吗?以下是我的代码结构。

import web
import json
import threading
import time

urls = (
'/testaccess', "TestAccess"
)

client_list = {}
lock = threading.Lock()

class clientObject(object):
# each created object here will attach another object from from deviceObject below

class deviceObject(object):
# Object items

class TestAccess:
def __init__(self):
pass

def GET(self):
return "abcd"

def POST(self):
raw_data = web.data()
json_dic = json.loads(raw_data)
process_data(json_dic)


def process_data (json_dic)
global lock
global client_list

lock.acquire()

# Perform some processing on the JSON data.

if XXXXXXXXXXXX:
# Create the new object and and update values.

client_list[ID] = clientObject()
client_list[ID].XX[ID].pred_vals(jsonInfo)
else:
# Update the object

print client_list # This prints all key:value pairs nicely as expected.

lock.release()

def data_cleaner()
global lock
global client_list
while True:
lock.acquire()

print client_list # this prints out just "{}"

# Do other things
lock.release()
time.sleep(5)

if __name__ == "__main__":

app = web.application(urls, globals())

def start_web_server():
app.run()

T2 = threading.Thread(target=data_cleaner)
T1 = threading.Thread(target=start_web_server)

T1.daemon = False

T1.start()
T2.start()

最佳答案

在 MartijnPieters 的帮助下,我通过在创建 Web 对象时添加“autoreloader = False”作为参数来解决此问题,如下所示。

if __name__ == "__main__":

app = web.application(urls, globals(), autoreload=False)

def start_web_server():
app.run()

T2 = threading.Thread(target=data_cleaner)
T1 = threading.Thread(target=start_web_server)

T1.daemon = False

T1.start()
T2.start()

关于python - 通过两个单独的线程访问全局字典返回不同的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28669185/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com