【问题标题】:python queue from multiprocessing is empty来自多处理的 python 队列为空
【发布时间】:2022-12-09 08:37:25
【问题描述】:

所以我正在尝试将值分配给模块多处理中的队列。我的代码是:

from multiprocessing import Queue

fileBlocks = Queue()
filesDic = dict()
cont = 0


def eDiv(files, k):
    global fileBlocks
    listLinesAllWithIdx = []
    index = 0
    bytesCount = 0
    blockLines = []
    blockLinesAll = []
    allBytes = 0
    n = 0
    lineCount = 0
    for file in files:
        with open(file) as f:
            filesDic[file] = index
            for line in f:
                listLinesAllWithIdx.append((index,line, utf8len(line)))
                allBytes += utf8len(line)
        index += 1

    while n < allBytes:
        bytesCount = 0
        blockLines = []
        while bytesCount <= k and lineCount < len(listLinesAllWithIdx):
            blockLines.append(listLinesAllWithIdx[lineCount])
            bytesCount += listLinesAllWithIdx[lineCount][2]
            lineCount += 1
        n += bytesCount
        blockLinesAll.append(blockLines)
    
    for i in blockLinesAll:
        fileBlocks.put(i)

    print(fileBlocks.empty())

def utf8len(s):
    return len(s.encode('utf-8'))


eDiv(["file1.txt","file2.txt"], 10)

我想从此命令 print(fileBlocks.empty()) 获得的输出是 True 但它给了我 False 我不明白为什么会这样

【问题讨论】:

    标签: python multiprocessing queue shared-memory


    【解决方案1】:

    看起来 print(fileBlocks.empty()) 语句在 fileBlocks 队列填充数据之前正在执行。在 eDiv 函数中,您使用 fileBlocks.put() 方法将数据添加到 fileBlocks 队列。然而,这个方法是异步执行的,所以打印语句是在数据被添加到队列之前执行的。

    要解决此问题,您可以将 print 语句移动到数据添加到队列的 for 循环之后,或者您可以使用 fileBlocks.join() 方法等待数据添加到队列之前打印结果。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-04-20
      • 2011-10-29
      • 2015-10-18
      • 2010-10-29
      • 1970-01-01
      • 2018-06-30
      • 2012-07-11
      • 1970-01-01
      相关资源
      最近更新 更多