擅长:python、mysql、java
<p>存在竞态条件,因为<code>data</code>在线程之间共享,您可以从线程中对其进行变异</p>
<p>可视化此竞争条件的一种简单方法是使用<code>sleep</code>和<code>print</code>模拟<code>request</code>调用:</p>
<pre class="lang-py prettyprint-override"><code>from concurrent.futures import ThreadPoolExecutor
from time import sleep
def getUrl(url, value):
data['key'] = value
sleep(0.3)
print(value, data["key"])
data = {'key': 1, 'fixedKey': 'fixedValue', 'fixedKey2': 'fixedValue2'}
resultArray = []
threadPool = ThreadPoolExecutor(32)
for i in range(100):
resultArray.append(threadPool.submit(getUrl, 'https://google.com', i))
</code></pre>
<p>您将看到传递给<code>getUrl</code>的值有时与存储在<code>data</code>中的值不同</p>
<p>一种解决方法是在变异前将<code>data</code>复制到局部</p>