【问题标题】:Multi-Threading and Asynchronous sockets in pythonpython中的多线程和异步套接字
【发布时间】:2012-03-28 05:53:44
【问题描述】:

我对 python 线程/网络编程很陌生,但有一项涉及上述两者的任务。 分配的要求之一是,对于每个新请求,我都会生成一个新线程,但我需要同时向浏览器发送和接收。 我目前正在使用 Python 中的 asyncore 库来捕获每个请求,但正如我所说,我需要为每个请求生成一个线程,我想知道同时使用线程和异步是否是矫枉过正,或者正确的方法做吗? 任何意见,将不胜感激。 谢谢

编辑: 我正在编写代理服务器,但不确定我的客户端是否是持久的。我的客户端是我的浏览器(为简单起见使用 firefox) 它似乎为每个请求重新连接。我的问题是,如果我打开一个带有http://www.google.comhttp://www.stackoverflow.com 的标签,我一次只能从每个标签收到一个请求,而不是来自google 和SO 的多个请求。

【问题讨论】:

  • 这个标题听起来像是一个糟糕的笑话。如果您真的决定无法以任何其他方式解决此问题,请查看 Twisted 之类的网络库以尝试增加一些理智。
  • 不能使用twisted,因为它对我有用。我需要的不仅仅是代码
  • 作业之类的?我认为有一个标签。
  • 是的,很抱歉,现在改了!

标签: python multithreading asynchronous network-programming


【解决方案1】:

我回答了一个听起来与你惊人地相似的问题,有人有一个家庭作业来创建客户端服务器设置,每个连接都在一个新线程中处理:https://stackoverflow.com/a/9522339/496445

一般的想法是你有一个主服务器循环不断寻找新的连接进入。当它找到时,你将它交给一个线程,然后它会自己监控新的通信。

关于异步与线程的额外信息

来自asyncore docs

只有两种方法可以让程序在单个处理器上运行 “一次不止一件事。”多线程编程是 最简单和最流行的方法,但还有另一种非常 不同的技术,让您拥有几乎所有的优势 多线程,而不实际使用多个线程。是真的 仅当您的程序很大程度上受 I/O 限制时才实用。如果你的程序 是处理器绑定的,那么抢占式调度线程可能是 你真正需要的。网络服务器很少受处理器限制, 但是。

正如这句话所暗示的,使用 asyncore 和 threading 在大多数情况下应该是互斥的选项。我上面的链接是线程方法的一个示例,其中服务器循环(在单独的线程或主线程中)执行阻塞调用以接受新客户端。当它得到一个时,它会产生一个线程,然后继续处理通信,服务器再次回到阻塞调用。

在使用 asyncore 的模式中,您将改为使用它的异步循环,该循环反过来会为发生的各种活动调用您自己注册的回调。这里没有线程,而是轮询所有打开的文件句柄以进行活动。您会感觉到所有事情都是同时进行的,但实际上它是按顺序安排所有事情的。

【讨论】:

  • 不完全是我想要的,但仍然解决了我的问题。
  • 很高兴它至少帮助解决了您的问题。我不认为这对您来说完全是一对一的解决方案,但我认为它是一个非常完整的示例,它为每个新的客户端连接启动一个线程来创建客户端/服务器套接字。
  • 我之前做过一个客户端-服务器,但这会为每个浏览器请求生成一个新线程。实际上,与问题无关,我将如何加快来自浏览器的请求的排队速度,因为它似乎一次只从每个选项卡加载一个请求......例如,如果我加载谷歌在一个选项卡和 SO 在另一个,我一次收到两个请求,但从来没有一次来自谷歌的 4 或 5 个,同时来自 SO 的 4 或 5 个..
  • 到目前为止,我还不确定您正在创建什么样的服务器。您的客户端是持久连接吗?它是否为每个请求重新连接,因此连接 == 请求?如果您与谷歌的“标签”只创建一个到服务器的客户端连接,那么它只有一个管道,所有请求都必须串行通过。在服务器端,它可以设置为从客户端串行处理每个 read(),或者再次生成读取数据的线程。显然,您仍然必须一次真正地执行 read() 一个。
  • 编辑了问题,试图澄清我在问什么。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-24
  • 2018-03-25
  • 1970-01-01
  • 2013-05-03
  • 1970-01-01
相关资源
最近更新 更多