Python的线程将更简单、更安全,而且由于它适用于基于I/O的应用程序,所以它们能够绕过GIL。也就是说,您是否考虑过使用Twisted或非阻塞套接字/SELECT进行非阻塞I/O?
编辑:关于线程的更多信息
Python线程
Python的线程是系统线程。然而,Python使用全局解释器锁(GIL)来确保解释器一次只执行一定大小的字节码指令块。幸运的是,Python在输入/输出操作期间释放了GIL,使得线程对于模拟非阻塞I/O非常有用。
重要警告:这可能会产生误导,因为字节码指令的数量确实有误导性。不对应程序中的行数。在Python中,即使是单个赋值也不一定是原子的,因此必须使用互斥锁。任何必须以原子方式执行的代码块,即使使用GIL。
QT线程
当Python将控制交给第三方编译模块时,它会释放GIL。模块的责任是在需要时确保原子性。当控制权被传回时,Python将使用GIL。这可能会使用第三方库与线程混淆。使用外部线程库更加困难,因为它增加了控制在模块手中的位置和时间与解释器之间的不确定性。
Qt线程使用释放的GIL操作。Qt线程能够同时执行Qt库代码(以及其他不获取GIL的编译模块代码)。但是,在Qt线程上下文中执行的Python代码仍然获得了吉尔,现在你必须管理二用于锁定代码的一组逻辑。
最后,Qt线程和Python线程都是系统线程的包装器。Python线程使用起来稍微安全一些,因为那些没有用Python编写的部分(隐式地使用GIL)在任何情况下都使用GIL(尽管上面的警告仍然适用)。
无阻塞I/O
线程给应用程序增加了极大的复杂性。特别是在处理Python解释器和编译的模块代码之间已经很复杂的交互时。虽然许多人发现基于事件的编程很难遵循,但是基于事件的、非阻塞的I/O通常比线程更难推理。
使用异步I/O,您可以始终确保,对于每个打开的描述符,执行的路径是一致和有序的。显然,必须解决一些问题,例如当依赖于一个开放通道的代码进一步取决于另一个公开通道返回数据时调用的代码的结果时,该怎么办。
基于事件的非阻塞I/O的一个很好的解决方案是新的。柴油图书馆。目前它仅限于Linux,但速度非常快,而且相当优雅。
这也是值得你花时间去学习的。化脓性的包装器,它为基于事件的编程提供了一个基本框架,使用系统可用的最快方法(在编译时确定)。