与random.shuffle一起使用线程时,从列表中得到错误的结果。 缺少值,其他值重复。
尝试使用numpy,但遇到相同的问题。
#!/usr/bin/python3 -tt
import random
from threading import Thread
class Th(Thread):
def __init__ (self, num, c):
Thread.__init__(self)
self.c = c
self.num = num
def run(self):
random.shuffle(self.c)
for self.i in self.c:
print (str(self.num) + ' - ' + self.i)
def main():
with open ('file.txt', 'rU') as cmddb:
c = [ cmd.strip() for cmd in cmddb]
cmddb.close()
print ('ref:')
for i in c:
print (i)
print ('----')
thread_number=0
for i in range(0,5):
thread = Th(thread_number,c)
thread.start()
thread_number += 1
if __name__ == '__main__':
main()
#################################3
Result:
file.txt:
ref:
10
20
----
0 - 20 <========
1 - 10
1 - 20
0 - 20 <========= duplicated / missimg 10
3 - 20 <=
3 - 20 <= again
4 - 10
2 - 10
4 - 20
2 - 20
问题有时会发生。其他时候运行正常。
答案 0 :(得分:1)
之所以会这样,是因为列表c是所有线程的相同列表。因此,在某些情况下,某些线程将打印c的第一个元素,例如10,而在其打印第二个元素之前,将在c上调用另一个名为shuffle的线程。如果c中值的顺序已更改,则第二个元素现在为10,因此将再次打印。为了避免这种情况,请为每个线程分配不同的c:
副本。更改:将thread = Th(thread_number,c)
更改为thread = Th(thread_number, c[:])