2017-09-21 2 views
1

Ich bin mit dem folgenden Code:Time.sleep scheint Haupt Thread zu blockieren, nicht nur Kind Thread?

from threading import Thread 
from time import sleep 

def file_write(file_input, num_lines): 
    sleep(10) 
    file = open("testfile.txt", "w") 
    for line in num_lines: 
     file.write("{}: {}".format(line, file_input)) 

    file.close() 


if __name__ == '__main__': 
    curr_thread = Thread(target=file_write, args=("Norah", range(5))) 
    curr_thread.daemon = False 
    curr_thread.start() 

Die Erwartung ist der Haupt-Thread sofort verlassen wird, weil ich nicht beitreten nennen. Aber das tut es nicht. Blockieren Schlafanrufe den Hauptthread?

EDIT: Es gibt eine ähnliche Frage in diesem Thread gestellt: time.sleep -- sleeps thread or process?, aber es ist nicht das Gleiche.
Ich schaute auf den Thread: es sagt, dass Schlaf keine untergeordneten Prozesse gegenseitig blockieren, aber es sagt nicht, was mit dem Hauptthread passiert. Wenn ich den Code von der angenommenen Antwort aus ausführte, wurde der Haupt-Thread nicht sofort beendet, wie ich dachte.

UPDATE: Sieht aus wie Multithreading wird mein Problem nicht lösen: das Ziel ist es, eine Reihe von Aufgaben im Hintergrund auszuführen. Ich benutze jetzt das Unterprozessmodul.

+0

Mögliches Duplikat von [time.sleep - schläft Thread oder Prozess?] (Https://stackoverflow.com/questions/92928/time-sleep-sleeps-thread-or-process) –

+0

Ich schaute auf den Thread: Es besagt, dass der Schlaf nicht dazu führt, dass untergeordnete Prozesse sich gegenseitig blockieren, aber er sagt nicht, was mit dem Hauptthread passiert. Wenn ich den Code von der angenommenen Antwort aus ausführte, wurde der Haupt-Thread nicht sofort beendet, wie ich dachte. –

+0

Machst du 'curr_thread.join()'? Der Haupt-Thread sollte sofort beendet werden. Das Beitreten des Threads wartet, bis der Thread fertig ist, bevor er beendet wird. –

Antwort

1

Schlaf ruft den Faden nur blockieren, in der sie genannt werden. Drucken Sie alles im Haupt-Thread sofort nach dem Anruf an curr_thread.start() wird dies Ihnen beweisen.

Wenn Sie jedoch Ihren Code unterbrechen (Strg-C), sehen Sie eine nützliche Stack-Trace. Der letzte Anruf befindet sich in der threading-Modul _shutdown()-Methode, die auf alle Nicht-Daemon Threads zum Beenden warten scheint.

t = _pickSomeNonDaemonThread() 
while t: 
    t.join() 
    t = _pickSomeNonDaemonThread() 

Und the documentation für das Einfädeln Modul lesen, können Sie sehen, dass: „Das gesamte Python-Programm beendet, wenn keine alive nicht-Daemon-Threads gelassen werden“ Da Sie also curr_thread.daemon = False erledigt haben, erzwingen Sie, dass der Haupt-Thread darauf wartet, dass dieser Thread zuerst beendet wird.

Ich sollte jedoch darauf hinweisen, dass Threads die "Daemon-Ness" ihrer Eltern erben. Da der Hauptthread niemals ein Daemon-Thread ist, hättest du curr_thread.daemon = False weglassen können, und du hättest das gleiche Verhalten.

+0

Thing ist, wenn ich curr_thread.daemon = True setzen, dann wird das Programm sofort beendet, aber der Kind-Thread scheint dabei abgerissen werden: die Datei schreiben Aufrufe werden nicht ausgeführt. –

+0

@NorahBorus Ja, der zweite Thread wird beendet. Dies liegt daran, dass der gesamte Prozess beendet wird, da keine Nicht-Daemon-Threads übrig sind. Der Haupt-Thread ist der einzige Nicht-Daemon-Thread, wenn Sie 'curr_thread.daemon = True' gesetzt haben, oder? Wenn es fertig ist (sofort, da du niemals '(join()') bist), wird der gesamte Prozess beendet. – bnaecker

+0

@NorahBorus Dies scheint ein bisschen wie ein XY-Problem zu sein. Warum willst du überhaupt einen zweiten Thread erstellen? Oder ist das eine Übung, um das Threading-Modul zu verstehen? – bnaecker

0

Natürlich blockiert ein Schlaf in einem Thread nicht den Hauptthread.

Dieser Code zeigt, dass Haupt weiter:

from threading import Thread 
from time import sleep 

def file_write(file_input, num_lines): 
    print('a') 
    sleep(5) 
    print('b') 


if __name__ == '__main__': 
    curr_thread = Thread(target=file_write, args=("Norah", range(5))) 
    curr_thread.daemon = False 
    curr_thread.start() 
    for i in range(5): 
     sleep(1) 
     print(i) 

Ausgang:

a 
0 
1 
2 
3 
b 
4 
+0

Siehe bnaeckners Kommentar und mein Codebeispiel: Ich habe angegeben, dass die Frage ist, was passiert, wenn der Hauptthread beendet wird. –

Verwandte Themen