我正在编写一个 NAT 的实现。我的算法如下:
- 数据包进来
- 如果是外部的,则检查查找表,如果是内部的,则添加到查找表
- 交换源地址并在途中发送数据包
我一直在阅读关于 Twisted 的文章。我很好奇 Twisted 是否利用了多核 CPU?假设系统有数以千计的用户,一个数据包紧随其后。使用twisted,查找表操作可以在每个内核上同时进行。我听说 GIL 无论如何都不允许这样做。也许我可以从多处理中受益>
Nginix 是异步的,可以愉快地同时为成千上万的用户提供服务。
我正在编写一个 NAT 的实现。我的算法如下:
我一直在阅读关于 Twisted 的文章。我很好奇 Twisted 是否利用了多核 CPU?假设系统有数以千计的用户,一个数据包紧随其后。使用twisted,查找表操作可以在每个内核上同时进行。我听说 GIL 无论如何都不允许这样做。也许我可以从多处理中受益>
Nginix 是异步的,可以愉快地同时为成千上万的用户提供服务。
不鼓励使用扭曲的线程。它在异步使用时具有非常好的性能,但是您为请求处理程序编写的代码不能阻塞。因此,如果您的处理程序是一段相当大的代码,请将其分解为更小的部分,并利用twisted 的著名Deferreds
功能通过回调附加其他部分。它当然需要与大多数程序员习惯的有所不同的思维方式,但它有好处。如果代码有阻塞部分,比如数据库操作,或者通过网络访问其他资源以获得一些结果,请尝试为这些任务找到异步库,这样你也可以Deferreds
在这些情况下使用。如果您不能使用异步库,您最终可能会使用该deferToThread
函数,该函数将在不同的线程中运行您要调用的函数并返回一个Deferred
为它,并在完成后触发你的回调,但最好将其用作最后的手段,如果没有别的办法。
以下是官方教程Deferreds
:
http://twistedmatrix.com/documents/10.1.0/core/howto/deferredindepth.html
还有另一个很好的指南,它可以帮助习惯于在“异步模式”下思考: