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

标签 python multithreading asynchronous network-programming

我对 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/

相关文章:

python - 使用 Pandas 数据框按日期和小时对数据进行分组

python - Tanh-sinh求积数值积分法收敛到错误值

c# - 调用线程 .NET .this 与 .control

c++ - 从线程池调用时,boost 的 io_service 是否共享请求线程?

java - 在 Android 中异步执行方法的最佳方式(紧凑且正确)

c# - WebClient.UploadValues 到 WebClient.UploadValuesAsync

javascript - 在同步回调中​​使用 dust.js(异步)

python - spaCy 中的什么工具可用于从股票代码识别公司名称?

python - python中的日期转换

java - 异步 DoInBackground 在 Listview 下崩溃