线程与异步网络(Twisted)Python

时间:2012-10-28 21:01:11

标签: python multithreading asynchronous twisted

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

  1. 数据包进入
  2. 如果是外部检查查找表,如果内部
  3. 则添加到查找表
  4. 交换源地址并在途中发送数据包
  5. 我一直在读Twisted。如果Twisted利用多核CPU,我很好奇吗?假设系统有数千个用户,一个数据包紧接着另一个。使用twisted can,查找表操作可以在每个核心上同时进行。我听说线​​程GIL不会允许这样做。也许我可以从多处理>

    获益

    Nginix是异步的,同时为数千名用户提供服务。

1 个答案:

答案 0 :(得分:4)

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

以下是Deferreds的官方教程:

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

另一个很好的指南,可以帮助你习惯于在“异步模式”中思考:

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