2016-03-18 15 views
7

Versuchen, meinen Kopf um Threading zu bekommen. In meinem Code feuert es nur einen Thread, wenn ich denke, dass es direkt zum zweiten gehen sollte. Ich habe über Sperren und Zuteilung gelesen, verstehe sie aber nicht ganz. Was müsste ich hier tun, um 2 Threads unabhängig voneinander laufen zu lassen?Verständnis Threading

+0

Sie werden tatsächliche und erwartete Ausgabe zeigen müssen für jemand in der Lage sein, Ihre Frage zu beantworten. –

Antwort

5

Sie haben die Signatur start_new_thread falsch. Sie rufen myproc an und übergeben das Ergebnis als Argument an start_new_thread, was nie passiert, da myproc nie beendet wird.

Stattdessen sollte es sein:

thread.start_new_thread(myproc, (thing,)) 

Das erste Argument ist die Funktion (dh die Funktion Objekt, nicht die Funktion aufrufen.) Und das zweite ist ein Tupel von Argumenten.

See: https://docs.python.org/2/library/thread.html#thread.start_new_thread

Sobald Sie Ihr Programm haben beide Threads tatsächlich beginnen, möchten Sie wahrscheinlich eine Pause am Ende hinzugefügt werden, da die Fäden bei der Haupt-Thread beendet beendet wird.

Verwenden Sie auch das Modul threading anstelle des Moduls thread, da es eine viel nettere Schnittstelle auf höherer Ebene bietet, z. B. eine bequeme Möglichkeit zu warten, bis die Ausführung der Threads abgeschlossen ist.

See: https://docs.python.org/2/library/threading.html#module-threading

+1

Das Skript beendet auch, bevor die Threads die Möglichkeit haben, etwas zu drucken –

+0

Das ursprüngliche Skript in der Frage nicht - es kam nicht so weit wie das Starten der Threads. Aber ja, das ist ein Problem, wenn Sie das ursprüngliche Problem beheben. – SpoonMeiser

+0

Brilliant - das macht Sinn! – user4893295

2

Ihre Anwendung beendet, bevor der zweite Thread Zeit hatte zu beenden, was ich sagen kann.

Sie müssen für beide Threads warten beenden, bevor die Anwendung beendet wird, wie folgt aus:

#!/usr/bin/python 

import thread 
import time 

# Define a function for the thread 
def print_time(threadName, delay): 
    count = 0 
    while count < 5: 
     time.sleep(delay) 
     count += 1 
     print "%s: %s" % (threadName, time.ctime(time.time())) 

# Create two threads as follows 
try: 
    thread.start_new_thread(print_time, ("Thread-1", 2,)) 
    thread.start_new_thread(print_time, ("Thread-2", 4,)) 
except: 
    print "Error: unable to start thread" 

while 1: # This is a bad solution due to the busy wait loop. More below. 
    pass 

Sie sollten die Thread-Objekte vorzugsweise speichern und thread1.join() und thread2.join() am Ende verwenden, vor dem Beenden, dass zu signalisieren Sie haben beide gekündigt.

+0

Das ist auch nützlich - wie würde ich die Threads speichern, wenn sie in einer Schleife erstellt werden? Ich müsste irgendwie die Variable "Sache" in den Instanznamen bringen? – user4893295

+0

@ user4893295 Siehe diese Seite http://www.tutorialspoint.com/python/python_multithreading.htm unter "Thread mit Threading-Modul erstellen" für Informationen zum Speichern eines Thread-Objekts! – Zolomon