在PyGTK中使用Gtk时如何在Python中实现互斥
我有一个应用程序,它使用在PyGTK中使用Gtk时如何在Python中实现互斥,python,multithreading,gtk,pygtk,mutex,Python,Multithreading,Gtk,Pygtk,Mutex,我有一个应用程序,它使用 gobject.timeout\u添加(延迟、函数) 现在在我的函数中,我想测试并设置一些变量,例如 def功能(自身): 如果flag==True: flag=False doSomething() 现在为了使这个线程安全,我必须使用互斥锁来锁定这个函数。 这在Gtk中是可能的吗?或者我可以使用threading中的PythonLock对象吗?我刚刚发现gobject.timeout\u add(delay,function)和gobject.idle\u add
gobject.timeout\u添加(延迟、函数)
现在在我的函数中,我想测试并设置一些变量,例如
def功能(自身):
如果flag==True:
flag=False
doSomething()
现在为了使这个线程安全,我必须使用互斥锁来锁定这个函数。
这在Gtk中是可能的吗?或者我可以使用
threading
中的PythonLock
对象吗?我刚刚发现gobject.timeout\u add(delay,function)
和gobject.idle\u add(function)
可以安全使用。我试着用它
for i in range(X):
gobject.idle_add(workerFunction)
并发现从来没有两个工作线程同时执行。这意味着gobject.timeout\u add(delay,function)
和gobject.idle\u add(function)
执行的函数调用似乎是原子的,因为它们总是严格地一个接一个地执行。因此,即使是问题中张贴的简单支票也没有必要
事实上,无论我做了什么,我都无法得到任何种族条件的显化。因此不需要额外的锁定机制。您可以使用
threading.Lock
来实现一个简单的互斥体。我还没有尝试过它,但我相信由于GLib的互斥体函数没有用Python包装,您应该只使用线程
。我已经删除了我的答案,我将用以下注释替换它:在深入了解gtk线程之前,我邀请您阅读这两个文档,希望它们能更有用:,。请注意,您不应该使用Python 2.x模块。(这是真的,老实说。)有没有写在什么地方保证不会有比赛条件?这样就不需要额外的锁定机构。否则,您只是自找麻烦,因为您的代码将在另一台机器上突然中断,或者在将来某个时间,idle\u add的内部实现发生更改时在同一台机器上突然中断。我还没有在文档中找到详细信息。但是我猜这个函数并不是真的在创建一个新线程,而是告诉gtk主循环在没有其他事情要做的时候调用这个函数。因此,它只对非常小和短的函数调用非常有用,否则GUI将没有响应。
for i in range(X):
gobject.idle_add(workerFunction)