为了更好地了解线程概念,我尝试在一个简单的程序中使用线程。我想调用一个函数3次随机选择。
def func(arg):
lst = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20]
num = random.choice(lst)
arg.append(num)
return arg
def search(arg):
a = func(arg)
a = func(a)
threads_list = []
que = queue.Queue()
for i in range(3):
t = threading.Thread(target=lambda q, arg1: q.put(func(arg1)), args=(que, a))
t.start()
threads_list.append(t)
for t in threads_list:
t.join()
while not que.empty():
result = que.get()
print (result)
if __name__ == '__main__':
lst = []
search(lst)
正如你所看到的在第三部分中,我使用了线程,但我希望得到不同的列表(第三部分不同)。
但所有线程都返回相同的答案。
任何人都可以帮我从不同的线程中获取不同的列表吗?
我想我误解了多处理和多线程的概念。
答案 0 :(得分:0)
可能,random.choice
正在使用的伪随机数生成器使用三个实例 - 每个线程一个 - 并且在没有唯一种子的情况下将生成相同的伪随机序列。由于没有提供种子,因此可能使用的系统时间取决于精度,对于所有三个线程可能是相同的。
您可以尝试在调用PRNG的线程内部使用线程与线程不同的东西来播种PRNG。这应该导致三个线程使用不同的种子,并为您提供不同的伪随机序列。