在Twisted或维护单独的实现中导致反应器不维护



未来编辑

从twisted 15.5.0和kivy 1.9.1开始,kivy的实现可以在python3上运行。我还使用AMP,它还没有发布,但2个月前被合并,将在下一个扭曲的版本中。

<标题> 介绍

我正在使用Kivy开发一个应用程序,并计划使用多处理和更重要的Twisted来扩展它。该应用程序有一个主组件和一个从组件,应该可以从不同的主组件控制,包括通过网络(因此是扭曲的)。

Kivy有自己的twisted支持代码(在Kivy/support.py中称为instal_twisted_reactor),它在python2中工作,但在python3中由于_threadselect反应器的未移植状态而无法工作。

我已经破解了twisted/internet/_threaddselect .py到python3的端口,这足以运行kivy示例代码(一个服务器GUI和一个客户端GUI发送文本)。通常我会去上游拉请求,但有几个因素在起作用:-

  1. _threaddselect .py,据我所知,在twisted中是没有维护的,事实上,在2006年他们的邮件列表中最后一次提到它(作为移除的候选)
  2. python3移植的扭曲需求包括适当的单元测试,我不需要知识(特别是网络方面的知识)来为这个反应器编写适当的单元测试
  3. 我不知道是否有任何其他项目(除了kivy)甚至使用_threaddselect .py
<标题> 主要问题

鉴于上述情况,是否建议努力使_treadedselect.py在上游打补丁(并因此移植到python3)?或者在我自己的项目中维护一个单独的实现(或者选择性地贡献给kivy的项目)会更有效吗?

免责声明:我(显然)不是任何项目的维护者

<标题>不必要的细节:

Kivy不是python中最流行的UI基础,因此它没有一个扭曲的维护反应器(像GTK, QT, TK等),但它最适合我想做的事情。我考虑过龙卷风等,但这是另一个问题。

而且,所需的修改(到目前为止)真的很小。queue to queue, zope接口装饰器,除了使用as而不是逗号,并且使用函数next而不是生成器的next方法。

感谢您有兴趣为Twisted生态系统做出贡献。我希望我能澄清你的困惑,这样你就可以继续前进了。

首先,Kivy是一个非常重要的Python库,也是我们Twisted项目非常关心的一个库(我非常高兴听到你把它们放在一起使用!)所以如果你认为Kivy没有反应器只是因为它"不是Python中最流行的UI基础",那你就错了;Twisted中没有反应堆的唯一原因是没有人贡献一个。

有几种可能的方法,但它们取决于你的问题中没有涉及的一些技术细节,一个SO的答案可能不足以解决冲突;你可能会想加入Twisted邮件列表并在那里讨论这个问题。

无论Python 3端口如何,_threadedselect是一个私有API,没有兼容性契约,Kivy不应该使用它。因此,为了向前发展,这需要改变。然而,它不太可能被删除,因为它是wxpython反应器的内部基础,其中是与Twisted一起分发的公共API,最终需要移植到python 3本身以完成移植。

第一种方法是改进_threadedselect的测试覆盖率,并使其再次成为公共API。这让我觉得不一定是最好的做法,因为让线程交互正确是非常棘手的,我不想鼓励人们——即使是那些处理低级实现细节的人——如果有其他选择的话,也要这样做。然而,如果_threadedselect在Kivy中有一个有效的用例,并且倡导者愿意做一些维护工作,这绝对是合理的。

第二种方法是在Kivy内部创建一个基于套接字监控API的反应器。有吗?Kivy封装的大多数ui (CoreFoundation、X11、Windows)都有某种内置的套接字监控功能。基维有可能接入吗?如果你能做到,这比线程化更不容易出错,但有时这是不可能的;我在Kivy中没有看到任何直接暴露的api。如果你可以开发这样的东西,它可以在Twisted或Kivy中,这取决于你的偏好。

我希望很快能在一个更注重讨论的论坛上听到你的消息。

最新更新