Language agnostic 如果是单线程进程,我的服务器将只能运行一个客户端。若有,原因为何?

Language agnostic 如果是单线程进程,我的服务器将只能运行一个客户端。若有,原因为何?,language-agnostic,client-server,multitasking,single-threaded,multiprocessor,Language Agnostic,Client Server,Multitasking,Single Threaded,Multiprocessor,我在谷歌上搜索得足够好,可以理解线程和进程。我感到困惑的一件事是关于单线程进程。 该场景是服务器-客户机应用程序进程,其中每个客户机都被视为服务器中的一个单线程进程。 一些博客说,单线程程序不能同时处理多个客户端,也就是说,它可以启动一个进程,只有在完成后,才能启动另一个进程。但是一些博客说这是可能的 根据我的理解,在单核处理器系统中,如果其编程为多任务,则根据为每个进程分配的时间片,可以同时处理多个进程。在多处理器系统中,也可以并行处理多个客户端进程。 只是web服务器一次不处理多个进程,因为

我在谷歌上搜索得足够好,可以理解线程和进程。我感到困惑的一件事是关于单线程进程。 该场景是服务器-客户机应用程序进程,其中每个客户机都被视为服务器中的一个单线程进程。 一些博客说,单线程程序不能同时处理多个客户端,也就是说,它可以启动一个进程,只有在完成后,才能启动另一个进程。但是一些博客说这是可能的

根据我的理解,在单核处理器系统中,如果其编程为多任务,则根据为每个进程分配的时间片,可以同时处理多个进程。在多处理器系统中,也可以并行处理多个客户端进程。 只是web服务器一次不处理多个进程,因为它是迭代服务器吗?如果它是任何其他并发服务器,它是否会处理多个进程,而不等待每个进程完成以处理下一个进程

由于我被不同博客中的许多不同解释弄糊涂了,我希望在单处理器和多任务环境(或多处理器环境)中,仅针对上述场景得到非常准确的答案。另外,我想知道使用单线程进程是否比不使用任何线程的进程有任何好处

对不起,如果我的理解是错误的。请回答


提前谢谢

如果您的服务器执行此操作:

while(true)
    listen()
    accept()
    read()
    process()
    write()
    close()
并且每个对accept、read、process、write和close的调用都是单线程的,因此在这些调用完成之前,服务器无法再次侦听新请求。如果服务器没有侦听请求,请求可能会排队,或者干脆被丢弃。如果与listen()相比,accept/read/process/write/close花费了很长时间,那么您的服务器将无法经常为请求提供服务。此外,如果有些请求需要100秒,有些请求需要1秒,而大部分时间都阻塞了对数据库或web服务等的I/O,那么您的大部分时间都在服务器上无所事事。以下是备选方案:

while(true)
    listen()
    start new thread()
        accept()
        read()
        process()
        write()
        close()

现在,您所做的同步工作就是启动新线程来处理传入的请求,然后立即开始再次侦听。操作系统将处理线程调度,如果其中一些线程等待很长时间等待某些I/O发生,您的服务器仍可以同时处理fast请求。

如果您的服务器执行此操作:

while(true)
    listen()
    accept()
    read()
    process()
    write()
    close()
并且每个对accept、read、process、write和close的调用都是单线程的,因此在这些调用完成之前,服务器无法再次侦听新请求。如果服务器没有侦听请求,请求可能会排队,或者干脆被丢弃。如果与listen()相比,accept/read/process/write/close花费了很长时间,那么您的服务器将无法经常为请求提供服务。此外,如果有些请求需要100秒,有些请求需要1秒,而大部分时间都阻塞了对数据库或web服务等的I/O,那么您的大部分时间都在服务器上无所事事。以下是备选方案:

while(true)
    listen()
    start new thread()
        accept()
        read()
        process()
        write()
        close()

现在,您所做的同步工作就是启动新线程来处理传入的请求,然后立即开始再次侦听。操作系统将处理线程调度,如果其中一些线程等待很长一段时间等待某些I/O发生,您的服务器仍可以同时处理快速请求。

非常感谢您的响应。我清楚地理解了这个解释。除此之外还有一个疑问:这里提到,在第一种方法中,如果不使用线程,“接受、读取、处理、写入和关闭的每个调用都是单线程的,那么服务器在这些调用完成之前无法再次侦听新请求。”这是否意味着即使我不在外部创建线程,一个进程被视为一个线程?非常感谢您的回复。我清楚地理解了这个解释。除此之外还有一个疑问:这里提到,在第一种方法中,如果不使用线程,“接受、读取、处理、写入和关闭的每个调用都是单线程的,那么服务器在这些调用完成之前无法再次侦听新请求。”这是否意味着即使我不在外部创建线程,进程是否被视为单个线程?