我正在编写一个NAT的实现。我的算法如下:线程vs异步网络(扭曲)Python
- 包进入
- 核对查找表,如果外部添加到查找表,如果内部
- 交换源地址和发送的道路上包
我一直在阅读Twisted。我很好奇Twisted是否利用了多核CPU?假设系统有成千上万的用户,并且一个数据包正好在另一个之后。在扭曲的情况下,查找表操作将在每个核心上同时发生。我听到线程GIL不会允许这个。也许我可以从多处理中获益>
Nginx是异步的,并且同时为上千个用户提供服务。
我正在编写一个NAT的实现。我的算法如下:线程vs异步网络(扭曲)Python
我一直在阅读Twisted。我很好奇Twisted是否利用了多核CPU?假设系统有成千上万的用户,并且一个数据包正好在另一个之后。在扭曲的情况下,查找表操作将在每个核心上同时发生。我听到线程GIL不会允许这个。也许我可以从多处理中获益>
Nginx是异步的,并且同时为上千个用户提供服务。
不鼓励使用扭曲的线程。它在异步使用时具有非常好的性能,但是您为请求处理程序编写的代码不得阻塞。所以如果你的处理程序是一个非常大的代码段,把它分解成更小的部分,并利用扭曲的着名Deferreds
通过回调附加其他部分。它肯定需要与大多数程序员习惯的想法稍有不同,但它有好处。如果代码具有阻塞部分(如数据库操作)或通过网络访问其他资源以获得某些结果,请尝试为这些任务找到异步库,以便在这些情况下也可以使用Deferreds
。如果你不能使用异步库,你最终可能会使用deferToThread
函数,它将运行你想在另一个线程中调用的函数,并返回一个Deferred
,并在完成时触发回调函数,但最好使用它作为最后的手段,如果没有别的办法可以做。
这里是Deferreds
官方教程:
http://twistedmatrix.com/documents/10.1.0/core/howto/deferredindepth.html
而另一个不错的指南,它可以帮助习惯认为 “异步模式”:
”不鼓励使用带有扭曲的线程。“ - 事实上,并非如此。如果线程是最佳可用解决方案,则使用Twisted使用线程会受到鼓励*。当他们比其他方法更糟糕的解决方案时使用线程是令人沮丧的 - 但这对于线程来说并不是唯一的。在使用Twisted时,使用比另一个更糟的解决方案是不鼓励的。 ;) –
那么,我是谁,以争论:) – andrean
的GIL在io绑定操作期间被释放,所以它不应该是一个问题。 – Bakuriu
线程会比异步更快吗? – user974896
如果它真的是IO绑定的,线程将不会比异步更快;对于一个线程来说,等待事情就像两个(或十个或......)一样容易。“ –