<p>此功能有几个问题:</p>
<blockquote>
<pre><code>def dataCollector_thread(stocksOnScreenListInfo, stocksOnScreen):
while(True):
placeholder = []
for stock in stocksOnScreen:
placeholer.append(RetrieveQuote(stock))
stocksOnScreenListInfo = placeholder
time.sleep(5)
</code></pre>
</blockquote>
<ul>
<li><p>您正在将此函数中的<code>stocksOnScreenListInfo</code>分配给一个新列表<code>placeholder</code>。您要做的是修改适当的内容,以便更新<code>main</code>中的<code>stocksOnScreenListInfo</code>。您可以这样做:<code>stocksOnScreenListInfo[:] = placeholder</code>(这意味着使用新列表从头到尾更改内容)</p>
</li>
<li><p><code>stocksOnScreen</code>在for循环中迭代时可能会更改,因为您正在另一个线程中更新它。你应该原子化地做这件事。A <a href="https://docs.python.org/3/library/threading.html#lock-objects" rel="nofollow noreferrer">lock</a>
(您将其作为参数传递给函数)将在这里有所帮助:它是一个同步原语,设计用于在多个线程共享数据且其中至少一个线程修改数据时防止数据争用</p>
</li>
</ul>
<p>我看不到<code>stocksOnScreenListInfo</code>在代码中的其他任何地方被使用。它是否用于其他功能?如果是这样的话,你应该考虑在它周围加一把锁</p>
<p>我将对函数进行如下修改:</p>
<pre><code>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)
</code></pre>
<p>在其他线程函数中:</p>
<blockquote>
<pre><code>def screenUpdate_thread(stocksSearchArray, stocksOnScreen):
while(True):
stocksOnScreen = UpdateScreen(stocksSearchArray)
</code></pre>
</blockquote>
<p>您正在将<code>stocksOnScreen</code>分配给此函数中的新列表;它不会影响<code>main</code>中的<code>stocksOnScreen</code>。同样,您可以使用符号<code>stocksOnScreen[:] = new_list</code>来实现这一点。我会在更新<code>stocksOnScreen</code>之前锁定,以确保其他线程函数<code>dataCollector_thread</code>以原子方式访问<code>stocksOnScreen</code>,如下所示:</p>
<pre><code>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)
</code></pre>
<p>正如你所看到的,我在一个小睡眠,否则的功能将不断循环,太CPU密集。另外,它将为Python提供一个在线程函数之间切换上下文的机会</p>
<p>最后,在<code>main</code>中创建一个锁:</p>
<pre><code>lock = threading.Lock()
</code></pre>
<p>并将<code>lock</code>作为参数传递给这两个函数</p>