我对python线程/网络编程很新,但是有一个涉及上述两个版本的赋值。 分配的要求之一是,对于每个新请求,我生成一个新线程,但我需要同时发送和接收到浏览器。 我目前正在使用Python中的asyncore库来捕获每个请求,但正如我所说,我需要为每个请求生成一个线程,我想知道是否同时使用线程和异步都是过度杀伤,或者正确的方法做到了吗? 任何意见,将不胜感激。 感谢
编辑: 我正在编写代理服务器,不确定我的客户端是否持久。我的客户端是我的浏览器(为简单起见使用firefox) 它似乎重新连接每个请求。我的问题是,如果我打开其中包含http://www.google.com的标签,并且其中包含http://www.stackoverflow.com,我每次只会从每个标签获得一个请求,而不是来自Google和SO的多个请求。
答案 0 :(得分:1)
我回答了一个听起来非常类似于你的问题,其中有人做了家庭作业来创建客户端服务器设置,每个连接都在一个新线程中处理:https://stackoverflow.com/a/9522339/496445
一般的想法是你有一个主服务器循环不断寻找新的连接进入。当它发生时,你把它交给一个线程,然后它将自己监视新的通信。
关于asyncore vs threading
的额外内容只有两种方法可以在单个处理器上安装程序 “一次不止一件事。”多线程编程就是这样 最简单和最流行的方式,但还有另一种方式 不同的技术,让你拥有几乎所有的优点 多线程,没有实际使用多个线程。是真的 只有当你的程序主要受I / O限制时才有用。如果你的程序 处理器绑定,然后可能是先发制人的预定线程 你真正需要的是什么网络服务器很少受处理器限制, 但是。
正如这句话所暗示的那样,使用asyncore和线程应该是大多数互斥选项。上面的链接是线程方法的一个示例,其中服务器循环(在单独的线程或主要线程中)执行阻塞调用以接受新客户端。当它获得一个时,它产生一个线程,然后继续处理通信,服务器再次返回阻塞调用。
在使用asyncore的模式中,您将改为使用其异步循环,该异步循环将依次为发生的各种活动调用您自己的已注册回调。这里没有线程,而是轮询活动的所有打开文件句柄。你可以同时做到所有事情的感觉,但在引擎盖下,它会按顺序安排所有事情。