从执行while tru的函数返回对象

2024-04-24 07:00:53 发布

您现在位置:Python中文网/ 问答频道 /正文

以一种非常天真的方式,我试图保存到一个gzip文件。 我在一个单独的线程中将该文件的chuncks添加到队列中,因为gzip压缩非常昂贵。我在internet上找到的使用多线程的最简单解决方案是定义一个新函数,该函数通过以下方式读取队列:

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。但我不想退回,因为这样我就退出了,而这是真的。 我见过收益率函数,但我认为它行不通


Tags: 文件函数truefor队列方式startlist
1条回答
网友
1楼 · 发布于 2024-04-24 07:00:53

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

您需要一种方法来通知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)

相关问题 更多 >