python中的多线程和异步套接字

时间:2012-03-21 00:30:30

标签: python multithreading asynchronous network-programming

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

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

1 个答案:

答案 0 :(得分:1)

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

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

关于asyncore vs threading

的额外内容

来自asyncore docs

  

只有两种方法可以在单个处理器上安装程序   “一次不止一件事。”多线程编程就是这样   最简单和最流行的方式,但还有另一种方式   不同的技术,让你拥有几乎所有的优点   多线程,没有实际使用多个线程。是真的   只有当你的程序主要受I / O限制时才有用。如果你的程序   处理器绑定,然后可能是先发制人的预定线程   你真正需要的是什么网络服务器很少受处理器限制,   但是。

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

在使用asyncore的模式中,您将改为使用其异步循环,该异步循环将依次为发生的各种活动调用您自己的已注册回调。这里没有线程,而是轮询活动的所有打开文件句柄。你可以同时做到所有事情的感觉,但在引擎盖下,它会按顺序安排所有事情。