Since the task is CPU bound, and you're still running on one core (for Python, by default), multi-threading would be of little use. Furthermore, PyQtGraph cannot have any plotting done in multiple threads: everything must be done in the main thread (see the author's response to a similar subject here). So, although multi-threading or multiprocessing could help you with fetching or processing data, it will not fix the main bottleneck: the plotting of too much data in too little space at too high a rate.
The solution? Downsample. Conveniently, PyQtGraph has this builtin. Here is an example (modified from the PyQtGraph example suite).
import numpy as np
import pyqtgraph as pg
from PySide import QtGui, QtCore
win = pg.GraphicsWindow(title="Basic plotting examples")
win.resize(1000,600)
win.setWindowTitle('pyqtgraph example: Plotting')
# Enable antialiasing for prettier plots
pg.setConfigOptions(antialias=True)
p1 = win.addPlot(title="Downsampled")
# normally would plot 1000, but we downsample by 10 fold
p1.plot(np.random.normal(size=1000), pen=(255,0,0), name="Red curve", downsample=10)
p2 = win.addPlot(title="Normal")
p2.plot(np.random.normal(size=1000), pen=(0,0,255), name="Blue curve",)
## Start Qt event loop unless running in interactive mode or using pyside.
if __name__ == '__main__':
QtGui.QApplication.instance().exec_()
And the result, here we have 10x less points on the left, allowing much higher performance.
