何时使用 multiprocessing.Queue 而不是 multiprocessing.

我已经尝试multiprocessing.dummy.Pool过multiprocessing.Pool多个深度学习项目。我很难理解它multiprocessing.Queue,我不明白它的需要。是否有特殊条件才有用。


作为一个例子,我有以下目标函数:


def process_detection( det_, dims ,classes):


    W = dims[0]

    H = dims[1]

    classes = classes

    boxes = []

    confidences=[]

    classIDs=[]

    classes_pred=[]

    for detection in det_:

                xcenter, ycenter, width, height = np.asarray([W, H, W, H]) * detection[0:4]

                confidence_encoded = detection[5:] # (80,) array

                index_class = np.argmax(confidence_encoded) #index of max confidence

                confidence = confidence_encoded[index_class] # float value of confidence (probability)

                # print(classes)

                class_predicted = classes[index_class] # class predicted


                if confidence > 0.5:

                    if class_predicted == "person":

                        print("{} , {:.2f}".format(class_predicted, confidence))

                        # continue

                        topX = int(xcenter - width/2.)

                        topY = int(ycenter - height/2.)

                        width = int(width)

                        height = int(height)

                        confidence = float(confidence)


                        bbox = [topX, topY, width, height]


                        boxes.append(bbox)

                        confidences.append(confidence)

                        classIDs.append(index_class)

                        classes_pred.append(class_predicted)


    return [boxes, confidences, classIDs, classes_pred]

(池在 while 循环外部关闭)。

  • 什么时候需要使用multiprocessing.Queue?

  • 我可以使用 multiprocessing.Queue 提高此代码的效率吗?


繁华开满天机
浏览 148回答 1
1回答

收到一只叮咚

一般来说,没有必要(也没有用)一起使用 aPool和 a Queue。a 最有用的方式Pool是在多个内核上并行运行具有不同数据的相同代码,以提高吞吐量。也就是说,使用该map方法及其变体。这对于每个数据项的计算独立于所有其他数据项的情况非常有用。Queue诸如和 之类的机制Pipe用于在不同进程之间进行通信。如果池工作线程中需要aQueue或 a Pipe,则该池工作线程完成的计算根据定义不是独立的。充其量,这会降低性能,Pool因为池工作人员可能必须等待数据可用。Pool在最坏的情况下,如果所有工作人员都忙于等待数据出现,它可能会完全停止Queue。如何使用Pool如果您预计所有计算将花费大约相同的时间,则只需使用该map方法即可。当所有计算完成后,这将返回。并且保证返回值与提交数据的顺序相同。_async(提示:当您要做的下一件事是调用get结果对象上的方法时,使用这些方法没有什么意义。)如果某些计算比其他计算花费的时间(长得多),我建议使用imap_unordered. 这将返回一个迭代器,一旦准备好,该迭代器将开始生成结果。结果将按照完成的顺序排列,而不是按照提交的顺序排列,因此您应该向结果添加一些标识符,以便您能够知道结果属于哪个输入数据。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python