我正试图围绕this recipe中发生的事情,因为我正在计划实现类似于此的wx / twisted应用程序(即.wx和在单独的线程中运行扭曲)。我知道需要以线程安全的方式访问twisted和wx事件循环(即reactor.callFromThread,wx.PostEvent等)。我要质疑的是在一个线程中实例化的对象的实例方法(在本配方的情况下,GUI线程)作为延迟的callBack和在单独线程中运行的反应器的errBack方法的线程安全性。这是个好主意吗?
有一个wxreactor可以扭曲,但谷歌搜索显示它已经有很多问题,因为它被引入到库中。即使是最初提出wxreactor技术的人,advocates running wx and twisted in separate threads。
我还没有找到这种技术的任何其他例子,但我很乐意看到一些。
答案 0 :(得分:0)
在线程之间传递实例方法的唯一行为是安全的,只要你正确地同步这些实例的最终销毁(线程共享内存,因此无论哪一个分配/初始化它都无关紧要)。
整体线程安全取决于这些方法实际上做了什么,所以只要让它们“玩得好”就可以了。你应该没问题。
答案 1 :(得分:0)
我不会说这是一个“好主意”。您应该使用wxreactor在同一个线程中运行reactor和GUI。
Schroeder先生描述的定时器驱动的事件循环饥饿方法是实现事件循环集成的最糟糕的故障安全方法。如果您使用wxreactor
(不是wxsupport
)Twisted现在使用一种方法,其中多路复用在内部分流到线程,因此不需要使用计时器。更好的方法是让wxpython公开wxSocket
并让某人在其上建立反应堆。
但是,如果您使用单独的线程与Twisted进行通信,那么要记住的一件事是,您可以使用源自您喜欢的任何线程的对象作为传递给{{1的值,你必须只在反应堆线程本身调用 Deferred.callback
。延迟不是线程安全的;感谢一些调试实用程序,即使Deferred.callback
类也不是线程安全的,因此在使用它们时永远不要离开Twisted主线程时需要非常小心。即,当您在UI线程中有结果时,请使用Deferred
。