【发布时间】:2019-07-17 20:57:02
【问题描述】:
我正在尝试使用 Qt 在后台运行一个长时间的阻塞调用。 (确切地说,pyattyscomm.AttysScan 的scan 方法。)我认为我应该使用QThread,并想出了以下内容:
import pyattyscomm
from PySide2.QtCore import QThread, Signal
class DataCollectionThread(QThread):
attys_ready = Signal()
def __init__(self, parent=None):
super().__init__(parent)
self.scanner = pyattyscomm.AttysScan()
def run(self):
self.scanner.scan() # this is a long, blocking call
self.attys_ready.emit()
但是,当我 start 线程(来自小部件中的某些逻辑)时,GUI 会挂起,直到 scan 方法完成(即一段时间)。
我用time.sleep(10) 替换了对scan 的调用,奇怪的是它并没有冻结用户界面。我需要/可以更改什么以避免scan 阻塞吗?
【问题讨论】:
-
你测试了哪个系统?
-
这是在 Linux 机器上。我可以稍后在其他机器上尝试测试(访问不那么容易。)
-
我不知道确切的问题是什么,但可能是 GIL (wiki.python.org/moin/GlobalInterpreterLock) 的问题。 swig 文档中标注了调用 C/C++ 函数时默认不释放 GIL,但需要进行配置。 swig.org/Doc4.0/Python.html 可能需要联系 Attys 的作者修复。
标签: python multithreading pyside2