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.
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
Am Ende der Datei habe ich: workQueue.join() filegz.close() – LBo
Sie sollten in thread1 beitreten. – malbarbo