python - 带有互斥锁的 QTimer 会导致程序意外退出吗?
问题描述
我们所知道的:
- 没有单次选项的 QTimer 将在特定时间间隔发出超时信号。
- Timeout 将在发出时调用一个函数。
- 互斥锁将锁定变量不被另一个线程修改。
我的问题是:
假设我有一个非常耗时的函数 F1 在一个线程中使用带有互斥锁的变量 A。而且,QTimer 正在运行一个循环调用函数 F2,该函数还在另一个线程中使用 A 和互斥锁。如果 F1 正在运行并且 A 被锁定,则 F2 将等待 A 解锁。QTimer 会在 F1 无限期运行时堆叠很多 F2 调用吗?
解决方案
似乎 Pyqt 会处理它。以下是两个示例线程:
class test_thread(QThread):
timer = QTimer()
def __init__(self, parent=None):
super().__init__(parent=parent)
self.timer.timeout.connect(self.start)
def run(self):
print("call")
global mutex
global n
mutex.lock()
n = n + 1
print(n)
mutex.unlock()
def process(self):
self.timer.start(1000)
class test_thread1(QThread):
def __init__(self, parent=None):
super().__init__(parent=parent)
def run(self):
global mutex
mutex.lock()
while True:
global n
n = n - 1
print(n)
time.sleep(1)
mutex.unlock()
测试两种情况:
test_thread1 没有
time.sleep(1)
test_thread 中的“调用”将永远不会被打印,并且 n 正在倒计时。
test_thread1 与
time.sleep(1)
“呼叫”只出现一次,n 也在倒计时。
推荐阅读
- go - 使用多个小部件制作小部件
- function - 一个简单的 React 组件中的无限循环
- python - 如何将 cookie 从烧瓶设置为 reactjs
- android - 离子构建错误:构建 APK(s):构建 APK 时出错。您可以在“消息”视图中找到错误。?
- python - 无法在 Folium 中使用“分组”数据
- c - 如果数字长于 5 位,则确定数字是奇数还是偶数的程序会显示错误的输出
- c# - 如何在统一自定义编辑器中从一组可编写脚本的对象中获取值?
- jestjs - 使用函数模拟许多模块
- android - 如何在 Android CameraX 中使用 USB 摄像头
- javascript - 如何在fabric js中创建一个大但分辨率低的画布?