我对 python 线程/网络编程很陌生,但有一个涉及上述两者的作业。 作业的要求之一是,对于每个新请求,我都会生成一个新线程,但我需要同时向浏览器发送和接收。 我目前正在 Python 中使用 asyncore 库来捕获每个请求,但正如我所说,我需要为每个请求生成一个线程,我想知道同时使用线程和异步是否过度,或者正确的方法做吗? 任何意见,将不胜感激。 谢谢
编辑: 我正在编写一个代理服务器,不确定我的客户端是否持久。我的客户端是我的浏览器(为简单起见,使用 Firefox) 似乎每个请求都会重新连接。我的问题是,如果我打开一个带有 http://www.google.com 的选项卡其中,以及 http://www.stackoverflow.com在其中,我一次只从每个选项卡收到一个请求,而不是来自 google 和 SO 的多个请求。
最佳答案
我回答了一个听起来与你惊人相似的问题,其中有人有一个家庭作业来创建客户端服务器设置,每个连接都在一个新线程中处理:https://stackoverflow.com/a/9522339/496445
总体思路是,您有一个主服务器循环不断地寻找新的连接进入。当它出现时,您将其交给一个线程,然后该线程将自己监视新的通信。
关于异步与线程的额外信息
来自asyncore docs :
There are only two ways to have a program on a single processor do “more than one thing at a time.” Multi-threaded programming is the simplest and most popular way to do it, but there is another very different technique, that lets you have nearly all the advantages of multi-threading, without actually using multiple threads. It’s really only practical if your program is largely I/O bound. If your program is processor bound, then pre-emptive scheduled threads are probably what you really need. Network servers are rarely processor bound, however.
正如这句话所暗示的那样,使用 asyncore 和线程在很大程度上应该是互斥的选项。我上面的链接是线程方法的一个示例,其中服务器循环(在单独的线程或主线程中)执行阻塞调用以接受新客户端。当它得到一个时,它会生成一个线程,然后该线程将继续处理通信,并且服务器再次返回到阻塞调用。
在使用 asyncore 的模式中,您可以使用其异步循环,该循环将依次为发生的各种事件调用您自己注册的回调。这里没有线程,而是轮询所有打开的文件句柄的事件。您会感觉到所有事情都是同时进行的,但实际上它是按顺序安排所有事情的。
关于python - python 中的多线程和异步套接字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9796999/