【问题标题】:Threads vs Asynchronous Networking (Twisted) Python线程与异步网络(扭曲)Python
【发布时间】:2012-10-28 21:01:11
【问题描述】:

我正在编写一个 NAT 的实现。我的算法如下:

  1. 数据包进来
  2. 如果是外部的,则检查查找表,如果是内部的,则添加到查找表中
  3. 交换源地址并在途中发送数据包

我一直在阅读有关 Twisted 的信息。我很好奇 Twisted 是否利用了多核 CPU?假设系统有数以千计的用户,一个数据包紧随其后。使用twisted,查找表操作可以在每个内核上同时进行。我听说 GIL 无论如何都不允许这样做。也许我可以从多处理中受益>

Nginix 是异步的,可以愉快地同时为成千上万的用户提供服务。

【问题讨论】:

  • GIL 在 io 绑定操作期间被释放,所以应该不是问题。
  • 那么线程会比异步更快吗?
  • 如果真的是IO-bound,线程不会比异步快;一个线程等待要做的事情就像两个(或十个或......)一样容易

标签: python multithreading asynchronous twisted


【解决方案1】:

不鼓励使用带扭曲的线程。它在异步使用时具有非常好的性能,但是您为请求处理程序编写的代码不能阻塞。因此,如果您的处理程序是一段相当大的代码,请将其分解为更小的部分,并利用twisted 著名的Deferreds 通过回调附加其他部分。它当然需要与大多数程序员习惯的有所不同的思维方式,但它有好处。如果代码有阻塞部分,比如数据库操作,或者通过网络访问其他资源以获得一些结果,请尝试为这些任务查找异步库,这样您也可以在这些情况下使用Deferreds。如果您不能使用异步库,您最终可以使用deferToThread 函数,该函数将在不同的线程中运行您要调用的函数并为其返回Deferred,并在完成时触发您的回调,但更好如果没有其他办法,就将其用作最后的手段。

这里是Deferreds的官方教程:

http://twistedmatrix.com/documents/10.1.0/core/howto/deferredindepth.html

还有一个很好的指南,它可以帮助你习惯在“异步模式”下思考:

http://ezyang.com/twisted/defer2.html

【讨论】:

  • “不鼓励使用带扭曲的线程。” - 事实上,它不是。如果线程是最好的可用解决方案,鼓励使用带有 Twisted 的线程。当线程是比其他方法更糟糕的解决方案时,不鼓励使用线程——但这并不是线程独有的。使用 Twisted 时,不鼓励使用任何比其他可用解决方案更糟糕的解决方案。 ;)
  • 好吧,我与谁争论:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多