【问题标题】:How to get different answers from different threads?如何从不同的线程中得到不同的答案?
【发布时间】:2017-06-05 10:05:50
【问题描述】:

为了更好地了解线程概念,我尝试在一个简单的程序中使用线程。我想调用一个随机选择的函数 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)

如您所见,在第三部分中,我使用了线程,但我希望得到不同的列表(第三部分不同)。 但所有线程都返回相同的答案。
谁能帮我从不同的线程中获取不同的列表?
我想我误解了多处理和多线程的概念。

【问题讨论】:

    标签: multithreading python-3.x random


    【解决方案1】:

    random.choice 使用的伪随机数生成器可能使用三个实例 - 每个线程一个实例 - 在没有唯一种子的情况下将产生相同的伪随机序列。由于没有提供种子,它可能使用系统时间,根据精度,所有三个线程可能都相同。

    您可以尝试在调用 PRNG 的线程内使用因线程而异的东西为 PRNG 播种。这应该会导致三个线程使用不同的种子并为您提供不同的伪随机序列。

    【讨论】:

    • 你能把你的想法付诸实践并修复代码吗?
    猜你喜欢
    • 2012-05-07
    • 1970-01-01
    • 2020-12-11
    • 2018-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多