<p><code>stocksOnScreen = ...</code>更改<em>引用</em>本身。由于引用作为参数传递给函数/线程,因此对函数/线程中原始<em>引用</em>的<em>副本</em>进行更改。(两个函数/线程都有自己的副本。)</p>
<p>因此,您应该操作它所引用的列表<em>对象</em>(例如<code>list.clear()</code>和<code>list.extend()</code>)</p>
<p>但是,正如您所看到的,它现在不再是一个<em>原子</em>操作。所以有可能<code>dataCollector_thread</code>会在一个空列表上工作(即什么都不做)并睡眠5秒钟。我也在下面提供了一个可能的解决方法。但不确定它是否应该(完美地)工作:</p>
<pre><code>def dataCollector_thread(stocksOnScreen):
while(True):
sos_copy = stocksOnScreen.copy() # *might* avoid the race?
for stock in sos_copy:
print(stock)
if (len(sos_copy) > 0): # *might* avoid the race?
time.sleep(5)
def UpdateScreen():
return ["TSLA"]
def screenUpdate_thread(stocksOnScreen):
while(True):
# manipulate the list object instead of changing the reference (copy) in the function
stocksOnScreen.clear()
# race condition: dataCollector_thread might work on an empty list and sleep 5 seconds
stocksOnScreen.extend(UpdateScreen())
def main():
stocksOnScreen = ["AAPL"] # List of the stocks currently displayed on LED screen
thread_data_collector = threading.Thread(target=dataCollector_thread, args=(stocksOnScreen,)) # note the comma
thread_data_collector.daemon = True
thread_data_collector.start()
thread_screen = threading.Thread(target=screenUpdate_thread, args=(stocksOnScreen,)) # note the comma
thread_screen.daemon = True
thread_screen.start()
</code></pre>
<p>注意:根据<a href="https://stackoverflow.com/a/6319267/5439097">this answer</a>,python列表是线程安全的,因此复制解决方案<em>应该</em>起作用</p>
<hr/>
<p>您可能也可以使用<a href="https://docs.python.org/3/reference/simple_stmts.html#the-global-statement" rel="nofollow noreferrer">^{<cd5>}</a>而不是将<code>stocksOnScreen</code>作为参数传递:</p>
<pre><code>def dataCollector_thread():
global stocksOnScreen # superfluous if no re-assignment
while(True):
for stock in stocksOnScreen:
print(stock)
time.sleep(5)
def UpdateScreen():
return ["TSLA"]
def screenUpdate_thread():
global stocksOnScreen # needed for re-assignment
while(True):
stocksOnScreen = UpdateScreen()
def main():
global stocksOnScreen # Or create stocksOnScreen outside main(), which is a function itself
stocksOnScreen = ["AAPL"] # List of the stocks currently displayed on LED screen
thread_data_collector = threading.Thread(target=dataCollector_thread)
thread_data_collector.daemon = True
thread_data_collector.start()
thread_screen = threading.Thread(target=screenUpdate_thread)
thread_screen.daemon = True
thread_screen.start()
</code></pre>
<p>参考文献:<a href="https://docs.python.org/3/faq/programming.html#what-are-the-rules-for-local-and-global-variables-in-python" rel="nofollow noreferrer">https://docs.python.org/3/faq/programming.html#what-are-the-rules-for-local-and-global-variables-in-python</a></p>