python多处理队列get([block [,timeout]]),阻塞队列中的项目还是阻塞队列?

时间:2017-07-11 01:30:04

标签: python queue multiprocessing

  

get([block [,timeout]])
  从队列中删除并返回一个项目。如果可选的args块为True(默认值)且timeout为None(默认值),则在必要时阻止,直到某个项可用为止。如果timeout是一个正数,它会阻止最多超时秒,如果在该时间内没有可用的项,则会引发Queue.Empty异常。否则(块为False),如果一个项立即可用,则返回一个项,否则引发Queue.Empty异常(在这种情况下忽略超时)。

如上所述。我编写了一个程序,只有一个生产者进程和六个使用者。进程之间的队列共享。

  • 制作人使用方法:put_nowait()
    1process * 6000项/秒
  • 当消费者使用get_nowait()时,消费者的get_nowait非常慢。
    6个过程*(0~500)项/秒。
  • 当消费者使用get(True,1)时,程序运行良好 6个过程*(1000~1600)项/秒。

在我看来。 get_nowait()应该更快get(块) get()方法的块如何工作,任何人都可以给我一些建议。

1 个答案:

答案 0 :(得分:1)

getget_nowait之间的效果没有差异。它的行为发生了什么变化。这在文档中有详细描述。

get_nowait与调用相同:

Queue.get(False)

这意味着调用者不会被阻止等待新数据可用。它不会使调用者“更快”。

如果您想要机会性地使用某些内容(如果可用),则使用get_nowait方法,否则执行其他操作。

您遇到的实际速度差异可能是由于非阻塞get与阻止内部Lock相比,对其内部get_nowait进行了更多访问。这将增加其成本。

您可以看到class CustomComboBox(QtGui.QComboBox): ... def paintEvent(self, evt): painter = QtGui.QStylePainter(self) painter.setPen(self.palette().color(QtGui.QPalette.Text)) option = QtGui.QStyleOptionComboBox() self.initStyleOption(option) painter.drawComplexControl(QtGui.QStyle.CC_ComboBox, option) textRect = QtGui.qApp.style().subControlRect(QtGui.QStyle.CC_ComboBox, option, QtGui.QStyle.SC_ComboBoxEditField, self) painter.drawItemText( textRect.adjusted(*((2, 2, -1, 0) if self.isShown else (1, 0, -1, 0))), QtGui.qApp.style().visualAlignment(self.layoutDirection(), QtCore.Qt.AlignLeft), self.palette(), self.isEnabled(), self.fontMetrics().elidedText(self.currentText(), QtCore.Qt.ElideRight, textRect.width()) ) ... here

的实际实施情况