第一件事是,我是一个很长时间的潜伏者,但第一次用户,我想感谢您创建网站!专用协议的长期多线程客户端(Python,select,epoll)
我处于需要实现专有协议的客户端部分的情况。该协议使用TCP/IP的下方和消息流可以被总结如下:
- 客户机连接到服务器
- 客户端表示在一个特定类型的数据中的感兴趣
- 如果服务器具有任何这样的数据,它它发送到客户端
- 客户确认接收到服务器
- 客户现在需要告诉它仍有意在同类型
- 服务器的数据的服务器将数据发送到客户端它是在
- 客户未来需要的应用程序级的保活请求从时间发送到服务器的时间(如每分钟左右)
- 从服务器的一些消息需要客户端发送回复回服务器
- 客户端断开
所有这一切是在一个TCP会话,这将是一个长期的活的,有点像我的WebSocket想象中发生。
另一件事是,所述客户端将被部署在多线程服务器上,并且应该允许从多个线程的并发访问,这意味着单个线程应该能够从到“订阅”到某一类型的消息服务器也应该能够发送消息给它。
我非常了解GIL,因此我猜这并没有太多的评论,我只写了一个客户端,我无法改变任何其他的架构。
因此,事情是我从来没有深入HTTP层次,我很幸运,总是使用一些已经存在的库,另一方面,我没有做过那么多的网络编程,那将是我第一次成为这样的人。
我希望它能成为我学习更多关于select,epoll,libev或gevent等异步库/工具/工具包的机会。
麻烦的是,网络上的大部分资源都与编写服务器有关,我甚至不确定是否要在多线程上部署客户端并不意味着它们都不会多做。所有服务器的人显然都是单线程的,但不清楚是不是因为多线程不需要,或者是因为像epoll这样的东西并不真的喜欢使用它们的多线程。
服务器清楚地对待所有客户端,就像它们是单线程单元一样,所以我想我需要序列化访问客户端。我无法得到的是如何确保服务器响应匹配线程,反之亦然。如果一个线程收到一条消息,但另一个线程需要确认它在收到消息之前收到的消息,那么我怎样才能确保消息不会混淆?
你怎么看待这一切?在这种情况下,异步库是不错的选择吗?你能想到我可以看看的任何代码示例吗?我使用的是Python,但我认为这个问题足够通用,我可以使用C,C++或Java来获得灵感。
很多,非常感谢!