当前位置: 首页 > 面试题库 >

Python GTK + 3安全线程

葛兴发
2023-03-14
问题内容

所以我应该在程序的开头运行什么以使其具有线程安全性(或在某些地方已读懂线程安全性):

from gi.repository import Gtk, Gdk, GLib, GObject
import threading

GLib.threads_init()     # ?
GObject.threads_init()  # YES!
Gdk.threads_init()      # ?

my_app()

def my_threaded_func():
   Glib.idle_add(lambda: some_gui_action())
   Glib.timeout_add(300, lambda: some_gui_action())

t = threading.Thread(target=my_thread_func)
t.daemon = True
t.start()

Gtk.main()

然后,我应该在线程中做什么?某种锁?使用Python的线程库是否安全?还是应该在GLib,GObject或Gdk中使用某些内容?我知道那里有很多问题/答案/示例,但是它们彼此矛盾,不是针对Gtk
+ 3,不是针对Python,或者仅仅是不完整,甚至我认为是Python GI的官方文档(http ://lazka.github.io/pgi-
docs/
)甚至都没有提到GObject.threads_init()和Gdk.threads_init()的存在。


问题答案:

https://wiki.gnome.org/Projects/PyGObject/Threading

..但是,不建议使用Gdk.threads_init(),我建议:

  • 根本不调用Gdk.threads_init,Gdk.threads_enter / leave
  • 使用GLib.idle_add代替Gdk.threads_add_idle(或任何其他Gdk.threads_ *函数)
  • 使用GLib.idle / timeout_add将接触Gdk / Gtk的内容推入主线程

为什么?:

  • 调用Gdk.threads_init意味着将没有锁,如果您从不从另一个线程访问GDK则可以。
  • 由于没有锁,因此Gdk.threads_enter不会执行任何操作。
  • 在这种情况下,GLib.idle_add等于Gdk.threads_add_idle。

关于其他库:

  • 一些GI模块可以在其他线程中发出某些信号/回调(例如,在GStreamer中,GstPlayBin :: about-to-finish信号);即使您根本不在代码中使用Python线程。不能直接在其中调用Gdk / Gtk代码,如果需要,也可以在其中使用idle_add。
  • GLib / GStreamer的许多部分都是线程安全的,可以从其他线程中调用。

tl; dr: 仅GObject.threads_init()*在线程中 使用 GLib.idle_add 将所有Gtk /
Gdk代码推送到主线程
*



 类似资料:
  • 从早期无线电通信技术出现伊始,无线电安全一直是行业所面临的主要问题之一,一战二战中,因为机密无线电信号被窃听、破解,导致情报泄密的事件不胜枚举,随着工业革命的深入,无线电技术早已不再是军事上的专利,它已经深入到了我们生活中的各个角落,日常使用的手机、GPS、WIFI、遥控器、智能硬件、电子支付,出行的汽车、飞机等等,其中都大量的使用了无线电技术,因为使用的普遍性,其所面临的安全状况,也愈加的严峻,

  • 嗯,我有三层来自控制器- 代码如下所示: 用户控制器。Java语言 用户服务。Java语言 例如,用户A和用户B同时运行相同的url,但参数不同 用户请求= 由于控制器是单例的,那么用户A的电子邮件变量是否会与用户B的电子邮件变量重叠,反之亦然? 我发现很难理解Singleton Thread-Safe在这种情况下是如何工作的。我的@Service和@Repository是否应该声明为@Scope

  • 问题内容: HttpUrlConnection线程安全吗?即,如果我有一个连接到服务器的HttpConnection实例,并且该实例被不同的线程使用(例如,尝试同时发送POST),HttpUrlConnection将如何处理这种情况?a)他们将串行发送POST,还是b)第一个线程发送POST,获取响应,然后第二个线程发送POST?如果它们以串行方式发送POST,则意味着到同一tcp连接的多个活动P

  • 假设我有一个Executors静态工厂方法的ExecutorService实例。 如果我从某个线程提交了一个调用,其中RetVal不是线程安全的本地实例化对象,那么当我从同一个线程获得()它时,我需要担心retvals的完整性吗?人们说局部变量是线程安全的,但我不确定当您返回一个本地实例化的对象并从其他线程接收它时,它是否适用。 下面是我的定制实现,我只是为了测试。您可以忽略EType枚举。

  • 在PHP初期,是作为单进程的CGI来运行的,所以并没有考虑线程安全问题。 我们可以随意的在全局作用域中设置变量并在程序中对他进行修改、访问,内核申请的资源如果没有正确的释放, 也会在CGI进程结束后自动地被清理干净。 后来,php被作为apache多进程模式下的一个模块运行,但是这仍然把php局限在一个进程里, 我们设置的全局变量,只要在每个请求之前将其正确的初始化,并在每个请求之后正确的清理干净

  • 问题内容: 自从我将哈希表用于任何重要的事情以来已经有一段时间了,但是我似乎想起了get()和put()方法是同步的。 JavaDocs没有反映这一点。他们只是说类Hashtable是同步的。我该怎么办?如果多个线程同时访问哈希表(假设它们没有修改同一条目),则操作将成功,对吗?我想我问的是“ java.util.Hashtable线程安全吗?” 请指导我摆脱这个问题… 问题答案: 它是线程安全的