另一个问题中的一些讨论鼓励我更好地理解多线程Python程序中需要锁定的情况.
每本文章在Python线程,我有当多个线程同时访问共享的状态可能出现的缺陷的几个实体,可测试的例子.此页面上提供的示例竞争条件涉及读取和操作存储在字典中的共享变量的线程之间的竞争.我认为这场比赛的情况非常明显,幸运的是,这是非常值得考验的.
但是,我无法通过列表追加或变量增量等原子操作来唤起竞争条件.这个测试详尽地试图展示这样一个种族:
from threading import Thread, Lock
import operator
def contains_all_ints(l, n):
l.sort()
for i in xrange(0, n):
if l[i] != i:
return False
return True
def test(ntests):
results = []
threads = []
def lockless_append(i):
results.append(i)
for i in xrange(0, ntests):
threads.append(Thread(target=lockless_append, args=(i,)))
threads[i].start()
for i in xrange(0, ntests):
threads[i].join()
if len(results) != ntests or not contains_all_ints(results, ntests):
return False
else:
return True
for i in range(0,100):
if test(100000):
print "OK", i
else:
print "appending to …Run Code Online (Sandbox Code Playgroud)