线程 vs 异步网络(Twisted)Python

4
我正在编写一个NAT实现。我的算法如下:
  1. 数据包进入
  2. 检查是否为外部数据包,如果是,则添加到查找表中;如果不是,则忽略
  3. 交换源地址并将数据包发送出去
我一直在研究Twisted框架。我很好奇Twisted是否利用了多核CPU?假设系统有数千个用户,一个接一个地传输数据包。使用Twisted可以让查找表操作在每个核心上同时进行吗?我听说使用线程的GIL无论如何都不允许这样做。也许我可以从多进程中受益。
Nginx是异步的,并且可以同时服务于成千上万的用户。

1
GIL在IO绑定操作期间被释放,因此不应该成为问题。 - Bakuriu
线程会比异步更快吗? - user974896
如果确实是IO绑定,那么线程不会比异步更快;对于一个线程来等待事情做,就像两个(或十个或......)这样的操作一样简单。 - Donal Fellows
1个回答

5
使用线程与Twisted是不鼓励的。当异步使用时,它具有非常好的性能,但您为请求处理程序编写的代码不能阻塞。因此,如果您的处理程序是相当大的一部分代码,请将其分解成较小的部分,并利用Twisted著名的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一起使用。不建议的是在存在比其他方法更差的情况下使用线程,但这几乎适用于任何情况。在使用Twisted时,如果有更好的可用解决方案,不使用任何比另一个更糟糕的解决方案都是不被鼓励的。;) - Jean-Paul Calderone
我又有什么资格对此表示异议呢 :) - andrean

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接