我已经尝试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
. 这将返回一个迭代器,一旦准备好,该迭代器将开始生成结果。结果将按照完成的顺序排列,而不是按照提交的顺序排列,因此您应该向结果添加一些标识符,以便您能够知道结果属于哪个输入数据。
添加回答
举报
0/150
提交
取消