HTTP 1.1服务器发送大文件

时间:2016-10-12 17:57:32

标签: multithreading http threadpool

我读过一篇关于使用自定义HTTP 1.1服务器为很多客户端提供服务的文章。它说,需要利用一个线程池,其线程数与CPU内核一样多,而不是为每个请求生成一个新线程。但是,假设一个文件长1 GB。它的传输将暂停线程池中的一个队列,同时传输文件,停止处理新请求。当然,在传输这些文件时会产生一个线程?但是应用什么标准来确定是否要生成新线程以提供请求,文件大小?还是其他一些?也许使用某种形式的合作多任务处理?

1 个答案:

答案 0 :(得分:1)

每个核心一个队列将是一个糟糕的设计。通常,每个池线程和全局队列都有一个队列。线程首先检查其队列,然后检查全局队列,然后检查其他线程的队列。没有工作会被卡住。

您可以在同一HTTP服务器中以混合方式使用阻塞和非阻塞IO。大多数请求都很快完成,因此使用非阻塞IO没有多大意义。

让长时间运行的请求使用非阻塞IO以便不占用太多线程是个好主意。 1GB的文件传输当然听起来很不错。

HTTP服务器中的套接字IO通常应该是非阻塞的。 HTTP服务器通常在许多连接客户端和长期连接的假设下运行。实现这种扩展几乎需要非阻塞IO。但请注意,虽然网络端应该是非阻塞的,但在架构上也不需要处理非阻塞请求。

套接字服务器有许多过时的设计(包括实现和教程)。使用现代API和现代设计,实现可扩展性和良好的代码质量确实不难。

相关问题