【问题标题】:HTTP stream server: threads?HTTP 流服务器:线程?
【发布时间】:2010-03-01 17:10:24
【问题描述】:

我已经在这里写过我要创建的 http 聊天服务器:Alternative http port? 此 http 服务器应将文本流式传输到网站上同一聊天室中的每个用户。浏览器将保持连接并等待进一步的 html 代码。 (是的,这行得通,浏览器不会拒绝连接)。

我有一个新问题:因为这个聊天服务器不需要从客户端接收信息,所以在服务器发出第一个响应后,不需要监听客户端。新的聊天消息将通过新连接发送到服务器。 所以我可以打开 2 个线程,一个等待新客户端(或新消息),一个等待 html 流。 这是一个好主意还是我应该为每个客户端使用一个线程?当有很多聊天用户在线时,我认为拥有一个线程/客户端并不好,因为服务器应该用自己的房间处理多个不同的聊天。

3 种可能性: 1.所有客户端的一个线程,连续向每个客户端发送文本 - 不应该有太多延迟,因为它只是文本 这将是:user1.send("text");user2.send("text"),... 2.每个聊天或聊天室一个线程 3. 每个聊天用户一个线程-...很多...

谢谢,我还没有用套接字做太多事情;)。

【问题讨论】:

    标签: c++ http stream


    【解决方案1】:

    现在,您似乎在思考一个给定的线程总是执行一个给定的(类型的)任务。虽然这种基本设计可能有意义,但要生产这样的可扩展服务器,它通常不能很好地工作。

    通常稍微抽象一点的观点效果更好:您有需要完成的任务,以及执行这些任务的线程——但线程并不真正“关心”它执行的任务。

    使用这种观点,您只需要创建某种数据结构来描述需要完成的每项任务。当你有一个你想要完成的任务时,你填写一个数据结构来描述这个任务,然后把它交给完成。在某个地方,有一些线程在执行任务。

    在这种情况下,线程的确切数量变得几乎无关紧要 - 您可以(并且可以)调整它以适应可用的 CPU 内核数量、任务类型等,而不是影响基本的程序设计。

    【讨论】:

    • 嘿,是的,我明白这一点,但这是我告诉安德烈的同一个问题, - 与此“聊天服务器”的 http 连接将保持几分钟或几小时的活动状态,并且任务始终相同(用户连接并且服务器发送内容(html流,而不是图像等),直到它断开连接,无需监听)。您不能像其他 http 服务器那样使用“池中有 10 个线程,等待连接关闭并等待新的连接”的概念。
    • 我刚刚查看了 IRCd 是如何处理这个问题的,他们似乎不使用线程,而是连续向房间里的每个人发送一条新消息。而且他们并不慢。你认为这个概念在我要编程的服务器上行不通吗?
    【解决方案2】:

    我认为这个简单应用程序最简单的模式是拥有线程池,然后为每个客户端选择可用线程或让它等到一个可用线程。

    如果你想深入了解 http 服务器架构概念,谷歌如下:

    1. apache 架构
    2. nginx 架构

    【讨论】:

    • 是的,但问题是是否有必要拥有超过(喜欢)2 个线程。由于这个程序应该只流式传输一些内容,我认为我不需要一个困难的架构。主要问题是:如果我只使用 2 个线程并且有 50 个连接。同时向每个客户发送短信会有问题吗?
    • 2个线程可以管理,但是效率不高。您不能真正同时发送短信。但是如果你没有太多的客户,它会很快以至于用户会认为它是同时的。我会说有必要> 2 ths。
    • 线程数有限制吗?当我为每个聊天打开一个线程时,在线用户不应该超过 30 个,但我想让我的用户能够创建自己的聊天。因此,如果只有 1 个用户聊天,它也会有自己的线程。 (如果没有人在聊天室中,则不需要线程)。另一种可能性是线程池,但我不知道如何划分用户。 - 也许“每个线程 20 个用户,如果已满则创建新用户”?
    • 线程是有限制的,但是如果你使用线程池,它可以更有效地利用系统资源,因为线程空闲的时间会更少。在客户端之间共享线程将一团糟,这是个坏主意。 http协议是request-response类型的,所以用户不会一直持有线程,所以线程池效果最好。
    • 是的,好的。但是这种聊天想法并不是真正的“请求-响应”,因为响应只会在用户退出聊天时结束,否则连接保持活动状态(“通常,在将响应数据提供给客户端后,Web 服务器不会终止连接. Web 服务器使连接保持打开状态,这样如果收到事件,它可以立即发送到一个或多个客户端。" 来源:en.wikipedia.org/wiki/Push_technology#HTTP_server_push),因此每个线程只处理一个客户端的线程池将无法工作在我看来,还是你的意思是别的?
    猜你喜欢
    • 2014-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-16
    • 2013-12-20
    • 2020-12-11
    • 2011-08-06
    • 2022-01-23
    相关资源
    最近更新 更多