2016-05-06 42 views
0

Ich habe ein großes System mit Arbeiter und Manager-Threads.Python "Drucken" verursacht Threading Deadlock

Ich habe in das Problem führen, dass einer der Threads verwendet:

print "before time sleep" 
time.sleep(5) 
print "after time sleep" 

Es beide viele Male gedruckt werden und „vor der Zeit schlafen“ plötzlich nur Anzeige dann Und aufhören, bis ich alle töten andere Themen. Keiner der anderen Threads stoppt.

Ich glaube, einiger anderer Teil des Codes in dem Commandline-Ausgang oder so etwas blockiert, aber ich habe keine Ahnung, wie die Stelle zu finden (es bis zu 24 Stunden dauern kann, bevor es geschieht)

I‘ m mit Python 2.7 und der Fehler tritt auf einem Windows-Server.

+2

[Wie erhalte ich einen threadsicheren Druck in Python 2.6?] (Http://stackoverflow.com/q/3029816/1207195) –

+0

Wenn es gesperrt bleibt, bis Sie alle anderen Threads beenden, dann liegt Ihr Problem darin die anderen Threads, nicht diese. –

+0

Ja, ich habe das herausgefunden, aber ich weiß nicht, ob die Position, in der es sich einsperrt, mir etwas über das Problem erzählen kann, das ich finden muss. – jpeg

Antwort

0

ich das gleiche Problem haben, je nachdem, was ich als Wert setzen in dem „Ende“ Attribut des Druckverfahrens, bekam ich einen ThreadLock:

from queue import LifoQueue 
import threading 
q = LifoQueue() 

for i in range(100): 
    q.put(i) 

def process_job(q, threadName): 
    while not q.empty(): 
     print(q.get(), end=' ') 

workers = [ 
    threading.Thread(target=process_job, args=(q,'1')), 
    threading.Thread(target=process_job, args=(q,'2')), 
    threading.Thread(target=process_job, args=(q,'3')), 
] 

for w in workers: 
    w.setDaemon(True) 
    w.start() 

Das Tollste ist, dass es perfekt funktioniert (soweit der Wert des Endes leer ist "").

+1

Nun, gleich nachdem ich dies gepostet habe, fand ich einen Kommentar von Mr. Alex Gaynor auf der folgenden Seite: [how-do-i-get-a-thread-safe-print-in-python-2-6] (http: //stackoverflow.com/questions/3029816/how-do-i-get-a-thread-safe-print-in-python-2-6) Insgesamt scheint seine Antwort sehr plausibel für das Problem. – Bevilaqua