2017-06-05 9 views
-1

Um Threading-Konzept besser kennen zu lernen, habe ich versucht, Threads in einem einfachen Programm zu verwenden. Ich möchte eine Funktion 3 Mal aufrufen, die zufällige Auswahl macht.
Wie bekomme ich verschiedene Antworten von verschiedenen Threads?

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) 

Wie Sie im dritten Teil sehen können, habe ich Threads aber ich erwartete verschiedene Listen (unterschiedlich für den dritten Teil) zu erhalten. aber alle Threads geben die gleiche Antwort zurück.
Kann mir jemand helfen, verschiedene Listen aus verschiedenen Themen zu bekommen?
Ich glaube, ich habe das Konzept der Multiprocessing und Multithreading missverstanden.

Antwort

0

Möglicherweise verwendet der Pseudozufallszahlengenerator, der random.choice verwendet, drei Instanzen - eine für jeden Thread - und in Abwesenheit eines eindeutigen Seed wird die gleiche Pseudozufallssequenz erzeugen. Da kein Seed bereitgestellt wird, kann die Systemzeit verwendet werden, die je nach Genauigkeit für alle drei Threads gleich sein kann.

Sie könnten versuchen, die PRNG mit etwas zu säen, das sich von Thread zu Thread innerhalb des Threads unterscheidet, der den PRNG aufruft. Dies sollte dazu führen, dass die drei Threads unterschiedliche Seeds verwenden und Ihnen verschiedene Pseudozufallssequenzen geben.

+0

Können Sie Ihre Gedanken in die Praxis umsetzen und den Code korrigieren? –

Verwandte Themen