随机产生错误结果的线程

时间:2019-10-19 12:09:54

标签: python-3.x

与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

问题有时会发生。其他时候运行正常。

1 个答案:

答案 0 :(得分:1)

之所以会这样,是因为列表c是所有线程的相同列表。因此,在某些情况下,某些线程将打印c的第一个元素,例如10,而在其打印第二个元素之前,将在c上调用另一个名为shuffle的线程。如果c中值的顺序已更改,则第二个元素现在为10,因此将再次打印。为了避免这种情况,请为每个线程分配不同的c:

副本。

更改:将thread = Th(thread_number,c)更改为thread = Th(thread_number, c[:])