gpt4 book ai didi

python - 更新传递给线程python的变量

转载 作者:行者123 更新时间:2023-12-03 12:45:45 25 4
gpt4 key购买 nike

我目前遇到的问题与我对线程的理解有关,或者可能与我对如何通过 python 中的线程传递/分配变量的理解有关。我有一个简单的程序,它接收屏幕上显示的当前股票列表并获取与这些股票相关的信息。我正在使用线程,以便我可以不断更新屏幕并不断收集数据。我有两个问题:

  1. dataCollector_thread() 里面我明白如果我附加到 stocksOnScreenListInfo 那变量 (stocksOnScreenListInfo) 在 main 已更新。

但是我不想附加到列表中,而是像下面这样重新分配列表,但这不起作用吗?

def dataCollector_thread(stocksOnScreenListInfo, stocksOnScreen):
while(True):
placeholder = []
for stock in stocksOnScreen:
placeholer.append(RetrieveQuote(stock))
stocksOnScreenListInfo = placeholder
time.sleep(5)
  1. screenUpdate_thread 中,我想将 stocksOnScreen 更新为函数 UpdateScreen 定义的变量“TSLA”。这似乎没有在 main 中更新其相应的 stocksOnScreen,因为当我打印以检查它是否继续说“AAPL”时?

    def main(args): 

    stocksOnScreen = ["AAPL"] # List of the stocks currently displayed on LED screen

    stocksOnScreenListInfo = [] # The quote information list for each stock on screen

    thread_data_collector = threading.Thread(target=dataCollector_thread, args=(stocksOnScreenListInfo,stocksOnScreen))
    thread_data_collector.daemon = True
    thread_data_collector.start()

    thread_screen = threading.Thread(target=screenUpdate_thread, args=(stocksSearchArray,stocksOnScreen))
    thread_screen.daemon = True
    thread_screen.start()



    def dataCollector_thread(stocksOnScreenListInfo, stocksOnScreen):
    while(True):
    for stock in stocksOnScreen:
    stocksOnScreenListInfo.append(RetrieveQuote(stock))
    time.sleep(5)

    def screenUpdate_thread(stocksSearchArray, stocksOnScreen):
    while(True):
    stocksOnScreen = UpdateScreen(stocksSearchArray)


    def UpdateScreen(stocksSearchArray):
    pass

    return ["TSLA"]

最佳答案

这个函数有几个问题:

def dataCollector_thread(stocksOnScreenListInfo, stocksOnScreen):
while(True):
placeholder = []
for stock in stocksOnScreen:
placeholer.append(RetrieveQuote(stock))
stocksOnScreenListInfo = placeholder
time.sleep(5)
  • 您正在将此函数中的 stocksOnScreenListInfo 分配给新列表 placeholder。您要做的是就地修改内容,以便更新 main 中的 stocksOnScreenListInfo。您可以这样做:stocksOnScreenListInfo[:] = placeholder(这意味着使用新列表从头到尾更改内容)。

  • stocksOnScreen 可能会在您在 for 循环中迭代它时发生变化,因为您是在另一个线程中更新它。您应该以原子方式执行此操作。 lock(您将其作为参数传递给函数)将在此处提供帮助:它是一种同步原语,旨在防止多个线程共享数据并且至少其中一个线程修改数据时发生数据竞争。

我看不到 stocksOnScreenListInfo 在您代码的其他任何地方使用。它是否用于其他功能?如果是这样,您应该考虑锁定它。

我会像这样修改函数:

def dataCollector_thread(stocksOnScreenListInfo, stocksOnScreen, lock):
while True:
placeholder = []
with lock: # use lock to ensure you atomically access stocksOnScreen
for stock in stocksOnScreen:
placeholder.append(RetrieveQuote(stock))
stocksOnScreenListInfo[:] = placeholder # modify contents of stocksOnScreenListInfo
time.sleep(5)

在你的其他线程函数中:

def screenUpdate_thread(stocksSearchArray, stocksOnScreen):
while(True):
stocksOnScreen = UpdateScreen(stocksSearchArray)

您正在将 stocksOnScreen 分配给此函数中的新列表;它不会影响 main 中的 stocksOnScreen。同样,您可以使用符号 stocksOnScreen[:] = new_list 来做到这一点。我会在更新 stocksOnScreen 之前锁定,以确保您的其他线程函数 dataCollector_thread 像这样原子地访问 stocksOnScreen:

def screenUpdate_thread(stocksSearchArray, stocksOnScreen, lock):
while True:
updated_list = UpdateScreen() # build new list - doesn't have to be atomic

with lock:
stocksOnScreen[:] = updated_list # update contents of stocksOnScreen

time.sleep(0.001)

如您所见,我进入了一个小 sleep ,否则该函数将不断循环并且过于占用 CPU。此外,它还为 Python 提供了在线程函数之间进行上下文切换的机会。

最后,在 main 中创建一个锁:

lock = threading.Lock()

并将lock作为参数传递给这两个函数。

关于python - 更新传递给线程python的变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66399006/

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