如何在Python中维护1000个阻塞TCP连接?

2024-06-01 03:22:06 发布

您现在位置:Python中文网/ 问答频道 /正文

我之所以需要这个,是因为我需要从1000台连接了GPRS调制解调器的设备上轮询数据,并为这些设备实现客户端协议 具有阻塞API,例如:

<data> = protocol.get_<some_data>(stream)

所有get方法都是阻塞的:它们只能返回数据或引发异常。流是从GPRS调制解调器到我们的应用程序建立的TCP套接字连接。协议是用python实现的。协议的复杂性很难描述大约有100种不同类型的设备具有特定的功能,而且get方法都知道这一点,因此协议实现非常复杂,例如将其移植到go或erlang(我会为此要求如此多的钱,我的老板会哭的)。所以这个问题听起来像是如何在python中维护1000个线程。我知道这个数量远远超出了python的可能性,这不仅是因为GIL(我现在使用CPython),还因为操作系统会感觉到第三次世界大战已经开始(我计划在一台服务器上实现所有这些)。在


Tags: 数据方法api应用程序协议客户端调制解调器data
1条回答
网友
1楼 · 发布于 2024-06-01 03:22:06

假设您绝对必须只使用阻塞I/O(例如,因为您有一个现有的代码库,要使用非阻塞I/O进行重写的代价太高),那么最简单的事情就是生成1000个线程。大多数操作系统都可以处理这么多线程(尽管不一定都那么高效),GIL不会成为问题,因为等待I/O被阻塞的线程不能容纳GIL。所有的线程都会被加速的问题所束缚

如果您发现一个有1000个线程的进程实际上太多了,而您的操作系统的处理能力太强了,您可以将这些线程分成多个进程(例如,10个进程,每个进程有100个线程,或者其他任何一个你认为最有效的比率)。如果问题是一个全局线程限制问题(例如1000个线程太多了,不管你把它们分散在多少个进程上),那么下一步你可以做的就是把它们分散到多台计算机上(例如,10台计算机每台运行100个线程)。在

不过,这些都是难看的解决方案;真正的解决方案是重写程序以使用非阻塞I/O,以便每个线程可以同时处理(可能很大)数量的套接字。如果您还没有读过,您可能想阅读C10K problem文章,主题是支持许多并发TCP连接。在

相关问题 更多 >