我正在尝试在Python的单独线程中做一些工作。我正在使用PyQt所以我的线程是QThreads。
工作本身涉及使用PIL加载大图像并将图像转换为QImage。
以下是一些在工作线程中反复加载图像的代码示例:
class testThread(QtCore.QThread):
def run(self):
while True:
im = Image.open('c:\zheadline.tif')
try:
imgData = ImageQt.ImageQt(im)
print (imgData.width())
except:
print ("Image load error")
图像非常大(16k),因此实际加载它可能需要几秒钟。但是,在此期间,GUI变得非常无响应,通常会冻结几百毫秒。
这是为什么?我的机器有16个内核,所以没有理由说1个线程的工作会导致所有其他线程的速度减慢,对吗?
基本上我希望能够在后台加载这些大图像而不会中断用户体验。有没有人有任何想法如何在不干扰主GUI线程的情况下将主要工作推送到另一个线程?
其他一些信息:我用'thread.start()'启动QThreads。此外,GUI在加载时间内没有完全冻结......它变得非常迟缓和缓慢,间歇性地冻结。
答案 0 :(得分:3)
python解释器一次只能在一个线程中运行(阅读全局解释器锁),因此Image.open和ImageQt.ImageQt中的一个或两个可能在python中执行大量工作而不释放GIL。
一种可能的解决方案是在单独的进程中加载图像并通过共享内存传输数据。我最近做了类似的事:http://bazaar.launchpad.net/~luke-campagnola/pyqtgraph/dev/view/head:/widgets/RemoteGraphicsView.py。有关如何从共享内存重建QImage的信息,请参阅'remoteSceneChanged'方法。