从执行while的函数返回一个对象true

时间:2016-05-13 18:36:51

标签: python multithreading queue

我以一种非常天真的方式尝试保存到gzip文件。 我在一个单独的线程中添加了该文件的队列块,因为gzip压缩相当昂贵。我在互联网上发现使用多线程的最简单的解决方案是定义一个以这种方式从队列中读取的新函数:

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()

但这种方式从不打印'结束'。 我知道这不是保存到文件的好方法,但我认为问题是我永远不会返回filegz。但是我不想归还它,因为这样我就退出了。 我已经看过了yield函数,但我认为它不会起作用。

1 个答案:

答案 0 :(得分:0)

我认为thread1不应该是守护进程,或者你应该join thread1

您需要一种方法来通知thread1没有更多项目。您可以在队列上放置一个特殊值来表示:

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)