Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在PyGTK中使用Gtk时如何在Python中实现互斥_Python_Multithreading_Gtk_Pygtk_Mutex - Fatal编程技术网

在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
中的Python
Lock
对象吗?

我刚刚发现
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)