为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

繁华开满天机 2023-08-22 16:58:27
我已经尝试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 提高此代码的效率吗?
查看完整描述

1 回答

?
收到一只叮咚

TA贡献1821条经验 获得超4个赞

一般来说,没有必要(也没有用)一起使用 aPool和 a Queue

a 最有用的方式Pool是在多个内核上并行运行具有不同数据的相同代码,以提高吞吐量。也就是说,使用该map方法及其变体。这对于每个数据项的计算独立于所有其他数据项的情况非常有用。

Queue诸如和 之类的机制Pipe用于在不同进程之间进行通信。如果池工作线程中需要aQueue或 a Pipe,则该池工作线程完成的计算根据定义不是独立的。充其量,这会降低性能,Pool因为池工作人员可能必须等待数据可用。Pool在最坏的情况下,如果所有工作人员都忙于等待数据出现,它可能会完全停止Queue


如何使用Pool

如果您预计所有计算将花费大约相同的时间,则只需使用该map方法即可。当所有计算完成后,这将返回。并且保证返回值与提交数据的顺序相同。_async(提示:当您要做的下一件事是调用get结果对象上的方法时,使用这些方法没有什么意义。)

如果某些计算比其他计算花费的时间(长得多),我建议使用imap_unordered. 这将返回一个迭代器,一旦准备好,该迭代器将开始生成结果。结果将按照完成的顺序排列,而不是按照提交的顺序排列,因此您应该向结果添加一些标识符,以便您能够知道结果属于哪个输入数据。


查看完整回答
反对 回复 2023-08-22
  • 1 回答
  • 0 关注
  • 147 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信