2009-06-07 93 views
1

我试图围绕在this recipe中发生的事情进行讨论,因为我正在计划实现类似于此的wx/twisted应用程序(即.wx和twisted在单独的线程中运行)。我知道twisted和wx事件循环需要以线程安全的方式访问(即reactor.callFromThread,wx.PostEvent等)。我在质疑的是在一个线程中实例化对象的实例方法(在这个配方的GUI线程中)传递为在单独线程中运行的反应堆的延迟callBack和errBack方法的线程安全性。这是一个好主意吗?在实例化线程中调用的实例方法

有一个wxreactor可用于扭曲,但是使用google搜索可以发现,自从它被引入到图书馆以来,它一直存在许多问题。甚至最初提出wxreactor技术的人,即advocates running wx and twisted in separate threads

我还没有找到这种技术的其他例子,但我很想看到一些。

回答

0

我不会说这是一个“好主意”。你应该使用wxreactor在同一个线程中运行reactor和GUI。

由施罗德先生描述的定时器驱动的事件循环饥饿方法是实现事件循环集成的最可能的故障安全方式。如果您使用wxreactor(而不是wxsupport)Twisted现在使用一种方法,即将多路复用内部分流到线程,以便无需使用定时器。更好的办法是让wxpython公开wxSocket并让其他人有基础的反应堆。但是,如果您使用单独的线程与Twisted进行通信,则需要记住的一点是,尽管您可以使用源自您喜欢的任何线程的对象作为值传递到Deferred.callback,您只能在反应器螺纹本身中调用 Deferred.callback。延迟不是线程安全的;由于一些调试实用程序,即使Deferred是线程安全的,所以在使用它们时永远不要离开Twisted主线程时需要非常小心。即当您在UI线程中获得结果时,请使用reactor.callFromThread(myDeferred.callback, myresult)

0

线程之间传递实例方法的唯一行为是安全的,只要你正确地同步这些实例的最终销毁(线程共享内存,因此分配/初始化其中的哪一个并不重要) 。

线程的整体安全性取决于这些方法实际做了什么,所以只要让它们“玩得很好”,你就应该没问题。