2016-05-13 4 views
0

In einer sehr naiven Art versuche ich in eine gzip-Datei zu speichern. Ich füge die Warteschlange Chuncks dieser Datei in einem separaten Thread, weil Gzip-Komprimierung ziemlich teuer. Die einfachste Lösung, die ich in Internet gefunden habe, Multi-Thread zu verwenden ist eine neue Funktion zu definieren, die auf diese Weise aus einer Warteschlange lautet:ein Objekt von einer Funktion zurückgeben, die eine Weile wahr ausführen

def savegz(filegz, workQueue): 
    while True: 
    user_list = workQueue.get() 
    print 'start' 
    for chunck in user_list: 
     filegz.writelines(chunck) 
    print 'end' 
    workQueue.task_done() 

... 
workQueue = Queue(0) 
thread1 = Thread(target=savegz, args=(filegz, workQueue)) 
thread1.setDaemon(True) 
thread1.start() 
... 
for user_list in something(a): 
    workQueue.put(user_list) 
... 
workQueue.join() 
filegz.close() 

Aber auf diese Weise nie druckt ‚Ende‘. Ich weiß, es ist nicht die gute Möglichkeit, in Datei zu speichern, aber ich denke, das Problem ist, dass ich filegz nie zurückgeben. Aber ich will es nicht zurückgeben, weil ich auf diese Weise das Wahre verlasse. Ich habe die Ertragsfunktion gesehen, aber ich denke nicht, dass es funktionieren würde.

+0

Sie haben 'thread1' als Daemon-Thread festgelegt. Machst du etwas, um auf seine Arbeit zu warten, oder beendest du einfach das Programm, bevor es seine Arbeit beenden kann? – user2357112

+0

Am Ende der Datei habe ich: workQueue.join() filegz.close() – LBo

+0

Sie sollten in thread1 beitreten. – malbarbo

Antwort

0

Ich denke, sollte nicht Daemon sein oder Sie sollten join auf thread1.

Sie müssen einen Weg zu informieren , dass es keine weiteren Elemente gibt. Sie können der Warteschlange einen besonderen Wert zuweisen:

def savegz(filegz, workQueue): 
    while True: 
    user_list = workQueue.get() 
    if user_list == None: 
     break 
    print 'start' 
    for chunck in user_list: 
     filegz.writelines(chunck) 
    print 'end' 
    workQueue.task_done() 

... 
workQueue = Queue(0) 
thread1 = Thread(target=savegz, args=(filegz, workQueue)) 
thread1.setDaemon(False) 
thread1.start() 
... 
for user_list in something(a): 
    workQueue.put(user_list) 
... 
workQueue.put(None) 
+0

ok ohne das Daemon-Argument funktioniert es. Aber es ist viel langsamer als ohne Multithreading. Mit Gewinde: jeder Chunck dauert 3-4sec Ohne Gewinde: 1 chunck 1 sek. Wie auch immer, danke – LBo