2012-10-28 133 views
3

我正在编写一个NAT的实现。我的算法如下:线程vs异步网络(扭曲)Python

  1. 包进入
  2. 核对查找表,如果外部添加到查找表,如果内部
  3. 交换源地址和发送的道路上包

我一直在阅读Twisted。我很好奇Twisted是否利用了多核CPU?假设系统有成千上万的用户,并且一个数据包正好在另一个之后。在扭曲的情况下,查找表操作将在每个核心上同时发生。我听到线程GIL不会允许这个。也许我可以从多处理中获益>

Nginx是异步的,并且同时为上千个用户提供服务。

+1

的GIL在io绑定操作期间被释放,所以它不应该是一个问题。 – Bakuriu

+0

线程会比异步更快吗? – user974896

+0

如果它真的是IO绑定的,线程将不会比异步更快;对于一个线程来说,等待事情就像两个(或十个或......)一样容易。“ –

回答

4

不鼓励使用扭曲的线程。它在异步使用时具有非常好的性能,但是您为请求处理程序编写的代码不得阻塞。所以如果你的处理程序是一个非常大的代码段,把它分解成更小的部分,并利用扭曲的着名Deferreds通过回调附加其他部分。它肯定需要与大多数程序员习惯的想法稍有不同,但它有好处。如果代码具有阻塞部分(如数据库操作)或通过网络访问其他资源以获得某些结果,请尝试为这些任务找到异步库,以便在这些情况下也可以使用Deferreds。如果你不能使用异步库,你最终可能会使用deferToThread函数,它将运行你想在另一个线程中调用的函数,并返回一个Deferred,并在完成时触发回调函数,但最好使用它作为最后的手段,如果没有别的办法可以做。

这里是Deferreds官方教程:

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

而另一个不错的指南,它可以帮助习惯认为 “异步模式”:

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

+3

”不鼓励使用带有扭曲的线程。“ - 事实上,并非如此。如果线程是最佳可用解决方案,则使用Twisted使用线程会受到鼓励*。当他们比其他方法更糟糕的解决方案时使用线程是令人沮丧的 - 但这对于线程来说并不是唯一的。在使用Twisted时,使用比另一个更糟的解决方案是不鼓励的。 ;) –

+0

那么,我是谁,以争论:) – andrean