精华内容
下载资源
问答
  • 多个web请求和多线程的区别
    千次阅读
    2021-03-08 19:49:26

    Servlet对并发的处理

    Tomcat容器处理多并发采用单例模式、多线程处理方式

    只要webapp被发布到web容器中的时候,servlet只会在发布的时候实例化一次,servlet在其生命周期中只有在将项目给移除或服务器stop的时候才会销毁,那么一个web项目从发布到运行只存在一个servlet的实例。

    servlet容器中包含有线程池,规定了线程池当中承载线程的数量

    当请求到达时,Servlet容器通过调度线程(Dispatchaer Thread) 调度它管理下线程池中等待执行的线程(Worker Thread)给请求者

    出现不同的线程同一时间访问同一个servlet的时候,其实servlet的对象只有一个,但是由于是tomcat支持多线程的原因,每个客户端请求执行的servlet中的函数都是在自己所支配的那一小段线程里面执行了,也就是说两个用户都登陆,都访问login方法,但是这是有用的是一个servlet但是局部的方法是放在不同的线程里面的。

    也就是说,整个过程servlet实例只有一个,供多个线程使用,每次servlet被访问都会被线程池的操作线程选出并提供一个新的线程进行操作

    servlet是线程安全的吗?

    Servlet体系结构是建立在Java多线程机制之上的,它的生命周期是由Web容器负责的。

    当客户端第一次请求某个Servlet时,Servlet容器将会根据web.xml配置文件实例化这个Servlet类。当有新的客户端请求该Servlet时,一般不会再实例化该Servlet类,也就是有多个线程在使用这个实例。Servlet容器会自动使用线程池等技术来支持系统的运行

    在Serlet中避免使用实例变量是保证Servlet线程安全的最佳选择。从Java 内存模型也可以知道,方法中的临时变量是在栈上分配空间,而且每个线程都有自己私有的栈空间,所以它们不会影响线程的安全。

    Servlet的线程安全问题只有在大量的并发访问时才会显现出来,并且很难发现,因此在编写Servlet程序时要特别注意。线程安全问题主要是由实例变量造成的,因此在Servlet中应避免使用实例变量。如果应用程序设计无法避免使用实例变量,那么使用同步来保护要使用的实例变量,但为保证系统的最佳性能,应该同步可用性最小的代码路径。

    线程安全和不安全的变量:

    1、静态变量:线程非安全。

    静态变量即类变量,位于方法区,为所有对象共享,共享一份内存,一旦静态变量被修改,其他对象均对修改可见,故线程非安全。

    2、实例变量:单例模式(只有一个对象实例存在)线程非安全,非单例线程安全。

    实例变量为对象实例私有,在虚拟机的堆中分配,若在系统中只存在一个此对象的实例,在多线程环境下,“犹如”静态变量那样,被某个线程修改后,其他线程对修改均可见,故线程非安全;如果每个线程执行都是在不同的对象中,那对象与对象之间的实例变量的修改将互不影响,故线程安全。

    3、局部变量:线程安全。

    每个线程执行时将会把局部变量放在各自栈帧的工作内存中,线程间不共享,故不存在线程安全问题。

    参考博文:

    更多相关内容
  • python多线程实现http请求

    千次阅读 2020-12-29 02:29:56
    -*- coding: utf-8 -*-import threading, datetime, time, httplib# 初始最大并发数START_THEAD_COUNT = 200# 递增并发数THREAD_INCREASE_STEP = 10# 域名DOMAIN = 'www.baidu.com'# 默认http请求METHOD = ...

    #!/usr/bin python2.6

    # -*- coding: utf-8 -*-

    import threading, datetime, time, httplib

    # 初始最大并发数

    START_THEAD_COUNT = 200

    # 递增并发数

    THREAD_INCREASE_STEP = 10

    # 域名

    DOMAIN = 'www.baidu.com'

    # 默认http请求

    METHOD = 'get'

    # 默认访问的web路径

    PATH = '/'

    # 请求发送间隔 整数

    INTERVAL = 5  # 5秒

    '''Factory'''

    class biz :

    '''Main'''

    def run(self) :

    start = datetime.datetime.now()

    global FAILED_COUNT

    FAILED_COUNT = 0

    threads = []

    # thread instance initialization

    for i in range(START_THEAD_COUNT) :

    t=threading.Thread(target=self.execute, args=())

    threads.append(t)

    # activate threads

    for i in range(START_THEAD_COUNT) :

    threads[i].start()

    # wait for all ends

    for i in range(START_THEAD_COUNT) :

    threads[i].join()

    delta = datetime.datetime.now() - start

    writeline('INFO', 'Total is \'' + str(START_THEAD_COUNT) + '\' while failed \'' + str(FAILED_COUNT) + '\' in ' + str(delta.seconds) + str(delta.microseconds / 1000) + 'ms.')

    return (True, None)

    '''Execute http request and get response status'''

    def execute(self) :

    global FAILED_COUNT

    conn = httplib.HTTPConnection(DOMAIN)

    conn.request(METHOD, PATH)

    r = conn.getresponse()

    if r.status not in (200, 302) : FAILED_COUNT = FAILED_COUNT + 1

    conn.close()

    return (True, None)

    '''Log writer'''

    def writeline(status, msg) :

    line = time.strftime('%Y-%m-%d %X', time.localtime(time.time())) + ' [' + status + '] ' + msg

    print line

    return (True, line)

    if __name__ == '__main__' :

    o = biz()

    while True :

    r, c = o.run()

    if not r : writeline('FAILED-', c)

    time.sleep(INTERVAL)

    # update max threads

    START_THEAD_COUNT = START_THEAD_COUNT + THREAD_INCREASE_STEP

    展开全文
  • django自带Gateway组件(类似Gunicorn 或者 uWSGI)实现并发处理多请求,runserver 默认是单进程多线程。 django-admin and manage.py:The development server is multithreaded by default. Use the --noth...

    以django为例:

    django自带runserver处理请求方式

    django自带Gateway组件(类似Gunicorn 或者 uWSGI)实现并发处理多请求,runserver 默认是单进程多线程。

    django-admin and manage.py
    The development server is multithreaded by default. Use the --nothreading option to disable the use of threading in the development server.

     

    django+nginx+uwsgi(gunicorn)处理请求方式

            相关资料:

    wsgi:一种实现python解析的通用接口标准/协议,是一种通用的接口标准或者接口协议,实现了python web程序与服务器之间交互的通用性。
    uwsgi:同WSGI一样是一种通信协议
    uwsgi协议是一个uWSGI服务器自有的协议,它用于定义传输信息的类型,它与WSGI相比是两样东西。
    uWSGI :一种python web server或称为Server/Gateway
    uWSGI类似tornadoweb或者flup,是一种python web server,uWSGI是实现了uwsgi和WSGI两种协议的Web服务器,负责响应python 的web请求。

            请求流程:

    首先客户端请求服务资源,
    nginx作为直接对外的服务接口,接收到客户端发送过来的http请求,会解包、分析,
    如果是静态文件请求就根据nginx配置的静态文件目录,返回请求的资源,
    如果是动态的请求,nginx就通过配置文件,将请求传递给uWSGI服务;uWSGI 将接收到的包进行处理,根据请求调用django工程的某个文件或函数,处理完后django将返回值交给uWSGI,
    uWSGI接收后转发给nginx,nginx最终将返回值返回给客户端(如浏览器)。

     

    简单的说就是服务端监听 socket 每次 accept 一个新的请求后,开一个线程处理 这个 socket 客户连接。

    一个请求进来,由uWSGI负责接受这个请求并分给一个线程,然后调用 django 工程中的文件或者函数 。django 只是逻辑框架,不是接受请求的服务器。uWSGI处理请求为多进程+多线程模式。

    而nginx则负责水平扩展这些uWSGI服务,它可以指定将请求分发给哪个uWSGI Server。这就是nginx负载均衡的原理。

     

     

    经过以上分析,再看一个高并发的nginx和uwsgi配置就不难了:

    nginx配置:

    worker_processes 1; #nginx 进程数,建议按照cpu 数目来指定,一般为它的倍数

    worker_rlimit_nofile 65535; #一个nginx 进程打开的最多文件描述符数目 

    events {
            worker_connections 20000;#每个进程允许的最多连接数
        }

    location / {
            uwsgi_send_timeout 600;        # 指定向uWSGI传送请求的超时时间,完成握手后向uWSGI传送请求的超时时间。
            uwsgi_connect_timeout 600;   # 指定连接到后端uWSGI的超时时间。
            uwsgi_read_timeout 600;        # 指定接收uWSGI应答的超时时间,完成握手后接收uWSGI应答的超时时间。
        }

     

    uwsgi配置:

    workers/processes = 24   # 并发处理进程数
    listen = 1000  # 并发的socket 连接数。默认为100。优化需要根据系统配置
    timeout = 60*60
    backlog = 10000

     

     

    展开全文
  • 需求是这样:如从文件中读取了10条数据,将数据参数循环给post请求,然后分别记录每个请求所用时间,最后记录平均请求时间,希望能从原有代码上使用多线程处理。请求和响应。 原有代码: //读取excel ds = ...
  • 多线程web中的使用

    千次阅读 2018-09-28 15:01:05
    整理网络上的 最典型的如: ... 且这类任务即使失败也不是特别重要的。 2、后台线程:比如定期执行一些特殊任务,如定期更新配置文件,任务调度(如...上百个客户端访问同一个web应用,tomcat接入后都是把后续的处理...

    整理网络上的

    最典型的如:
    1、用户注册完成送大礼包/积分之类,且积分等也是另一个系统并比较耗时;
    且这类任务即使失败也不是特别重要的。

    2、后台线程:比如定期执行一些特殊任务,如定期更新配置文件,任务调度(如quartz),一些监控用于定期信息采集等。

    回答二:
    最典型的应用比如tomcat,tomcat内部采用的就是多线程。
    上百个客户端访问同一个web应用,tomcat接入后都是把后续的处理扔给一个新的线程来处理,这个新的线程最后调用到我们的servlet程序,比如doGet或者doPost方法。
    如果不采用多线程机制,上百个人同时访问一个web应用的时候,tomcat就得排队串行处理了,那样客户端根本是无法忍受那种访问速度的。

    还有就是需要异步处理的时候,需要使用多线程。
    比如task a和task b要并行处理,单个线程只能串行处理,先做完task a然后再做task b。

    如果想要多个task同时执行的话,就必须为每个task分配一个线程,然后通过java虚拟机的线程调度,来同时执行多个任务。

    比如你的CPU是多核心的话,就可以让一个CPU执行一个线程。
    如果只有一个CPU的话,底层是按照分时复用的原则,各个线程按照时间片来获得CPU资源。

    回答三:

    特别耗时的操作

    如备份数据库,可以开个线程执行备份,然后执行返回,前台不断向后台询问线程执行状态问

    JAVA项目中哪些场景需要用到多线程,深感迷茫,请使用过的高手指点。

    场景一:
    一个业务逻辑有很多次的循环,每次循环之间没有影响

    比如验证1万条url路径是否存在,正常情况要循环1万次,逐个去验证每一条URL,这样效率会很低,假设验证一条需要1分钟,总共就需要1万分钟,有点恐怖。

    这时可以用多线程,将1万条URL分成50等份,开50个线程,每个线程只需验证200条,这样所有的线程执行完是远小于1万分钟的。

    场景二:

    需要知道一个任务的执行进度,比如我们常看到的进度条,实现方式可以是在任务中加入一个整型属性变量(这样不同方法可以共享),任务执行一定程度就给变量值加1,另外开一个线程按时间间隔不断去访问这个变量,并反馈给用户。

    总之使用多线程就是为了充分利用cpu的资源,提高程序执行效率,当你发现一个业务逻辑执行效率特别低,耗时特别长,就可以考虑使用多线程。

    不过CPU执行哪个线程的时间和顺序是不确定的,即使设置了线程的优先级

    因此使用多线程的风险也是比较大的,会出现很多预料不到的问题,一定要多熟悉概念,多构造不同的场景去测试才能够掌握!

    最典型的如:1、用户注册完成送大礼包/积分之类,且积分等也是另一个系统并比较耗时;且这类任务即使失败也不是特别重要的。2、后台线程:比如定期执行一些特殊任务,如定期更新配置文件,任务调度(如quartz),一些监控用于定期信息采集等。回答二:最典型的应用比如tomcat,tomcat内部采用的就是多线程,上百个客户端访问同一个web应用,tomcat接入后都是把后续的处理扔给一个新的线程来处理,这个新的线程最后调用到我们的servlet程序,比如doGet或者doPost方法。如果不采用多线程机制,上百个人同时访问一个web应用的时候,tomcat就得排队串行处理了,那样客户端根本是无法忍受那种访问速度的。还有就是需要异步处理的时候,需要使用多线程。比如task a和task b要并行处理,单个线程只能串行处理,先做完task a然后再做task b。如果想要多个task同时执行的话,就必须为每个task分配一个线程,然后通过java虚拟机的线程调度,来同时执行多个任务。比如你的CPU是多核心的话,就可以让一个CPU执行一个线程。如果只有一个CPU的话,底层是按照分时复用的原则,各个线程按照时间片来获得CPU资源。回答三:特别耗时的操作,如备份数据库,可以开个线程执行备份,然后执行返回,前台不断向后台询问线程执行状态问:JAVA项目中哪些场景需要用到多线程,深感迷茫,请使用过的高手指点。答:场景一:一个业务逻辑有很多次的循环,每次循环之间没有影响,比如验证1万条url路径是否存在,正常情况要循环1万次,逐个去验证每一条URL,这样效率会很低,假设验证一条需要1分钟,总共就需要1万分钟,有点恐怖。这时可以用多线程,将1万条URL分成50等份,开50个线程,没个线程只需验证200条,这样所有的线程执行完是远小于1万分钟的。场景二:需要知道一个任务的执行进度,比如我们常看到的进度条,实现方式可以是在任务中加入一个整型属性变量(这样不同方法可以共享),任务执行一定程度就给变量值加1,另外开一个线程按时间间隔不断去访问这个变量,并反馈给用户。总之使用多线程就是为了充分利用cpu的资源,提高程序执行效率,当你发现一个业务逻辑执行效率特别低,耗时特别长,就可以考虑使用多线程。不过CPU执行哪个线程的时间和顺序是不确定的,即使设置了线程的优先级,因此使用多线程的风险也是比较大的,会出现很多预料不到的问题,一定要多熟悉概念,多构造不同的场景去测试才能够掌握!


    有一些比较耗时,但又很重复的工作可以多线程。

    比如入库,入库时很耗时的。但如果入库的数据已准备好,并且很多。多线程就好一些。

    比如同步数据,你不知道什么时候对方会给你传递数据过来,这个时候你就间隔一段时间让他自己去执行,其实还涉及一些逻辑上的处理比较耗的。这样不影响你其他地方的处理……

    (1)线程的工作场景主要有两条:
    一个是并发操作,避免阻塞和更有效利用资源。典型的例子有:在长时间工作的程序中使用工作线程避免界面失去响应。在网络下载程序中,使用多个线程提高对网络的使用效率,更快下载文件。
    一个是并行,线程是处理器调度的最小单位。如果你的计算机配置了多个处理器或者内核,那么可以同时利用多个处理器同时计算,加快问题解决的速度。
    (2)多线程的工作原理:
    对于单处理器系统,操作系统会轮流调度每个线程执行一小段时间,然后切换另一个线程,在切换的时候,保存当前线程使用的寄存器上下文和堆栈,并且在下次调度的时候恢复。这样线程中的程序感觉不到自己被中断过。对于多处理器系统,操作系统会将不同的线程调度给多个处理器,让它们并行执行。

    这个要用,由很多可用的,看你的程序结构,发邮件是一个,假如你的文档管理系统要做全文索引,那么在用户上传一个文件后,后台要做索引,就可以启动一个线程去创建索引,还有如果你的文档管理系统权限比较复杂,涉及文件夹父子关系权限的继承和覆盖等复杂的ACL操作,都可以使用多线程。

    1、单线程和多线程区别:
    单线程处理的优点:同步应用程序的开发比较容易,但由于需要在上一个任务完成后才能开始新的任务,所以其效率通常比多线程应用程序低,如果完成同步任务所用的时间比预计时间长,应用程序可能会不响应。
    多线程处理可以同时运行多个过程,简单说下多线程开发的益处:
    1.多线程开发可以将耗时操作放入子线程,将UI刷新加入主线程,防止页面卡顿。
    2.在并发操作时使用多线程,如C/S架构的服务器端并发线程响应用户的请求。
    3.在多核CPU系统中,使用线程可以提高程序响应速度,提高CPU和内存的利用率。
    4.改善程序结构。将一个复杂的的进程分为多个线程,减少类之间的耦合。
    5.将程序分块管理,方便程序的开发和维护。
    6.可以随时停止任务。 可以分别设置各个任务的优先级以优化性能。
    2、开启多线程
    一个请求就是一个线程,这个线程不需要我们来控制,WEB容器自己实现,这是第一个应用。
    我们也可以在web中new线程来做我们的事。比如,当我有一个很耗时的操作,像统计排名之类的功能。当用户在web上点击排名时,由于这个计算量太大,可能要计算3~5分钟或更久。这时我们会在servlert中new一个线程来做这个事情,这样用户就可以点击排名后去做其他的事,等排名出来现通知他。如果不new线程当用户点排名时,浏览器就会一直卡在这里,一个圈圈转啊转的,就是不出来。所以我们可以new线程来做耗是任务。还有很多比如,定时任务、WEB版的爬虫程序、监听等
    3、场景一:一个业务逻辑有很多次的循环,每次循环之间没有影响,比如验证1万条url路径是否存在,正常情况要循环1万次,逐个去验证每一条URL,这样效率会很低,假设验证一条需要1分钟,总共就需要1万分钟,有点恐怖。这时可以用多线程,将1万条URL分成50等份,开50个线程,没个线程只需验证200条,这样所有的线程执行完是远小于1万分钟的。
    场景二:需要知道一个任务的执行进度,比如我们常看到的进度条,实现方式可以是在任务中加入一个整型属性变量(这样不同方法可以共享),任务执行一定程度就给变量值加1,另外开一个线程按时间间隔不断去访问这个变量,并反馈给用户。
    场景三:电商项目中controller层需要接收前台传来的需要下架商品id,因为是全选操作所以也就是数据库中商品表的所有id。然后调用service层业务逻辑进行删除。本人数据库中商品表大概有3000条数据,在不考虑多线程方式下,速度已经明显受到影响,实际项目中又何止成千上万条数据!如果单线程逐一进行删除其性能可想而知。所以考虑创建多个线程,多线程并发形式执行商品下线业务逻辑。
    总之使用多线程就是为了充分利用cpu的资源,提高程序执行效率,当你发现一个业务逻辑执行效率特别低,耗时特别长,就可以考虑使用多线程。不过CPU执行哪个线程的时间和顺序是不确定的,即使设置了线程的优先级,因此使用多线程的风险也是比较大的,会出现很多预料不到的问题,一定要多熟悉概念,多构造不同的场景去测试才能够掌握!

    为什么要使用多线程?
    1.防止阻塞主线程,提高吞吐量
    2,提高资源的利用率
    应用场景:
    1,最典型的应用比如tomcat,tomcat内部采用的就是多线程,上百个客户端访问同一个web应用,tomcat接入后都是把后续的处理扔给一个新的线程来处理,这个新的线程最后调用到我们的servlet程序,比如doGet或者doPost方法。

    2,做登录业务时使用到sms短信网关业务,创建子线程,让子线程去调用sms服务,主线程则返回,这样做可以提高用户的体验度
    3,图片上传业务
    4

    项目中如何使用多线程
    多线程在项目中主要用来解决并发任务执行。java中线程的主要实现方式有三种:继承Thread类 实现Runnable接口 实现Callable接口。另外还可以通过Executor类来创建多线程线程池。
    线程生命周期:首先通过继承thread或者实现runnable接口来创建一个线程,当调用线程的start方法,线程进入就绪状态,如果这时处理器有资源运行此线程,线程就进入运行状态,如果线程内部调用了sleep就会放弃cpu资源,返回到阻塞状态,线程等待某个通知,sleep时间到了之后,如果其他线程发送通知,那么当前线程就从阻塞状态变为就绪状态恢复执行。另如果调用了yield()方法也会从运行状态变为就绪状态。一般来说线程执行完毕或者调用stop方法线程结束生命周期。
    四种模板线程池:1可缓存线程池 newCachedThreadPool 2定长线程池 newFixedThreadPool 3定长支持定时及周期性任线程池, newScheduledThreadPool 4单线程化的线程池(有序) newSingleThreadExecutor 。我们在项目中主要使用了第二种就是定长线程池newFixedThreadPool,一般多线程进行并行任务处理需要配合队列使用。队列中存放任务信息,当线程池中的线程进行任务处理,主动去队列领取任务,队列将任务弹出并交由线程执行,所有线程谁先执行完,就领取行的任务,直到队列中没有任务。
    线程安全:一般通过加锁解决安全问题,保证数据一致性。一般我们可以使用synchronized标记方法或者代码块,来保证原子性操作。但是synchronized性能不如volatile。 在java底层中一些设计线程安全的源码都是用了volatile关键字。多线程如果要保证数据安全必须要保证原子性、可见性以及有序性。一般情况下当多个线程同时执行时,如果多个线程同时访问同一变量,如果变量所在方法没有使用synchronized,将导致每个线程只关注自己线程内cache的变量值,当多个线程将变量同步到主线程的主存时,会发生数据不一致的情况。如果使用volatile可以让变量拥有可见性,多个线程进行执行时,每个线程都会看到主线程中的主存的变量值发生的改变,进行修正,保证与自己线程数据同步,在线程修改变量时,volatile关键字会强制将修改的值立即写入主存,其他线程中的对应缓存变量就会被强制标记为无效,而从主存中进行同步。

    项目业务场景:
    批量页面静态化 在系统中,商品详情页我们使用freemarker来进行页面静态化,每天夜里12点开始要对所有商品页面进行一遍静态化,由于商品数量比较多 如果使用单线程将耗时过长,我们使用一个定长线程池进行批量执行,将任务放在队列中,多个线程同时领取并执行。

    订单处理(用户下单后可能支付状态不明确,我们后台可以通过多线程去主动核实第三方支付状态,来更新我们系统的订单状态)
    登录后用户信息处理(用户登录后应该通知各相关系统将用户常用数据进行缓存 以快速响应登录用户),

    大CC的博客

    内容目录:
    多进程模型多线程模型选用参考

    多线程和多进程模型的选用
    这里的线程指通过linux的pthread_create而产生的原生线程,线程资源很宝贵,能被操作系统的任务调度器看见的(不是python gevent、go gorouine里的概念);
    我们讨论以下两种模型;
    多进程单线程模型(以下简称为多进程);单进程多线程模型(以下简称为多线程);多进程模型
    优点
    编程相对容易;通常不需要考虑锁和同步资源的问题。
    更强的容错性:比起多线程的一个好处是一个进程崩溃了不会影响其他进程。
    有内核保证的隔离:数据和错误隔离。
    对于使用如C/C++这些语言编写的本地代码,错误隔离是非常有用的:采用多进程架构的程序一般可以做到一定程度的自恢复;(master守护进程监控所有worker进程,发现进程挂掉后将其重启)
    多进程的案例
    nginx主流的工作模式是多进程模式(也支持多线程模型)
    几乎所有的web server服务器服务都有多进程的,至少有一个守护进程配合一个worker进程,例如apached,httpd等等以d结尾的进程包括init.d本身就是0级总进程,所有你认知的进程都是它的子进程;
    chrome浏览器也是多进程方式。
    redis也可以归类到“多进程单线程”模型(平时工作是单个进程,涉及到耗时操作如持久化或aof重写时会用到多个进程)
    多线程模型
    优点
    多线程优点:创建速度快,方便高效的数据共享
    共享数据:多线程间可以共享同一虚拟地址空间;多进程间的数据共享就需要用到共享内存、信号量等IPC技术;
    较轻的上下文切换开销 - 不用切换地址空间,不用更改寄存器,不用刷新TLB。
    提供非均质的服务
    如果全都是计算任务,但每个任务的耗时不都为1s,而是1ms-1s之间波动;这样,多线程相比多进程的优势就体现出来,它能有效降低“简单任务被复杂任务压住”的概率;
    适用的场景
    1 线程间有数据共享,并且数据是需要修改的(不同任务间需要大量共享数据或频繁通信时);
    2 提供非均质的服务(有优先级任务处理)事件响应有优先级;
    3 单任务并行计算,在非CPU Bound的场景下提高响应速度,降低时延;
    4 与人有IO交互的应用,良好的用户体验(键盘鼠标的输入,立刻响应)
    多线程案例
    桌面软件,响应用户输入的是一个线程,后台程序处理是另外的线程;
    memcached
    选用
    单进程多线程和多进程单线程,2种模式如何取舍?
    进程线程间创建的开销不足作为选择的依据,因为一般我们都是使用线程池或者进程池,在系统启动时就创建了固定的线程或进程,不会频繁的创建和销毁;
    首先,根据工作集(需要共享的内存)的大小来定;如果工作集较大,就用多线程,避免cpu cache频繁的换入换出;比如memcached缓存系统;
    其次,选择的依据根据以上多线程适用的场景来对比自身的业务场景,是否有这样场景需求:数据共享、提供非均质的服务,单任务拆散并行化等;
    如果没有必要,或者多进程就可以很好的胜任,就多用多进程,享受单线程编程带来便利;
    RCU的发明者,Paul McKenny 在《Is Parallel Programming Hard, And, If So, What Can You Do About It?》说过:
    能用多进程方便的解决问题的时候不要使用多线程。
    参考
    ref:《Linux多线程服务端编程:使用muduo网络库》
    ref:http://www.zhihu.com/question/19903801
    ref:https://computing.llnl.gov/tutorials/pthreads/#WhyPthreads


    本文来自 RoyKuang07 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/pirlck/article/details/52296716?utm_source=copy

    本文来自 Xiayubing_ 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/Xiayubing_/article/details/81381704?utm_source=copy

    本文来自 袖扣 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/Sundefind/article/details/79062239?utm_source=copy

    本文来自 fmwind 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/fmwind/article/details/77068706?utm_source=copy
    参考链接

    https://blog.csdn.net/kangkang_hacker/article/details/80863359?utm_source=copy

    展开全文
  • 多线程和高并发的区别

    千次阅读 2019-05-29 11:20:09
    “高并发和多线程”总是被被一起提起,给人的感觉好像他们相等,其实 高并发 不等于 多线程 多线程是完成任务的一种方法,高并发是系统运行的一种状态,通过多线程有助于系统承受高并发的状态的实现。 高并发是...
  • SpringBoot--多线程处理

    千次阅读 2021-07-31 00:38:02
    原文网址:SpringBoot--多线程处理_IT利刃出鞘的博客-CSDN博客 简介 为什么需要多线程 项目里经常会遇到这样的场景: 读一次数据库的某个表 遍历这些数据,对每一数据,都以它为条件再次查其他表 将第二步查到的...
  • 多线程,到底该设置多少线程?

    千次阅读 2019-06-02 13:26:30
    作者:享学课堂老顾 微信公众号: 享学课堂online 一、前言 “不好了,线上服务器超时严重,请求非常...有严重误区,以为线程池设置太小了,调大点请求就会快了。 今天就带着小伙伴们沟通一下,线程池的大小应该...
  • Java Web基础篇之Java多线程

    千次阅读 2019-05-08 13:18:06
    进程与线程区别,线程的划分尺度小于进程,使得多线程程序的并发性高。 另外,进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率。 线程在执行过程中与进程还是有区别的。...
  • 一次web请求,进入tomcat守护线程

    千次阅读 2016-12-21 18:21:38
    l 一次web请求,进入tomcat 服务器处理请求的模式 1. 收到一请求就处理,这时候就不能处理新的请求,这种为阻塞 这是单线程模型 2. 收到一请求就新开一个线程去处理任务,主线程返回,继续处理下一...
  • 线程是共享cpu的,那么多线程比单线程,能提升处理速度吗? 好比,一窗口(一cpu),三个人来办理业务。单线程:一办完一办。多线程:大家轮着办,我一会给你办,你会儿给他办。 但是单线程,..
  • 1.web应用中,要对某一个任务用多线程实现,最简单的代码格式是不是必须把要执行的代码放在run方法中? WEB服务器会帮你把每个访问请求...2.部署在服务器上的一个网站,多个浏览器在访问同一个功能点时,存在多线程之说
  • 什么是进程? 当一个程序开始运行时,它就是一个进程,进程包括运行中的程序程序所使用到的内存系统资源。...多线程是指程序中包含多个执行流,即在一个程序中可以同时运行多个不同的线程来执行不同的任务, 也...
  • 我的理解是:tomcat 服务器采用非阻塞机制,对于每一次网络访问请求都是开一个新的线程进行处理,当有多个请求访问相同的资源的时候是不是就已经涉及到了多线程的内容?是不是就要考虑线程安全等的问题?还是说...
  • 当然既然是都是 多这个字开头,那么就是多任务,我们需要了解并发:指的是任务数多余cpu核数,通过操作系统的各种任务调度算法, 实现⽤多个任务“⼀起”执⾏(实际上总有⼀些任务不在执⾏,因为切换任 务的速度...
  • 实验描述 本编程作业的题目描述: 在本实验中,您将了解Web代理服务器的工作原理及其基本功能之...通常,当客户端发出一个请求时,请求将被直接发送到Web服务器。然后Web服务器处理该请求并将响应消息发送客户端。为...
  • Java多线程--并发并行的区别

    万次阅读 2016-04-10 22:45:56
    所以并发肯定是宏观概念,在微观上他们都是序列被处理的,只不过资源不会在某一个上被阻塞(一般是通过时间片轮转),所以在宏观上看多个几乎同时到达的请求同时在被处理。如果是同一时刻到达的请求也会根据优先级的...
  • http请求就是一个线程吗,java的服务是每收到一个请求就新开一个线程来处理吗 答案是:是,一http请求,就是一个线程。 https://blog.csdn.net/elvis_lfc/article/details/53466877 ... ===总结 ...
  • 单线程与多线程区别

    万次阅读 多人点赞 2018-07-02 13:33:12
    什么是进程?当一个程序开始运行时,它就是一个进程,进程包括运行中的程序程序所使用到的...多线程是指程序中包含多个执行流,即在一个程序中可以同时运行多个不同的线程来执行不同的任务,也就是说允许单个程...
  • 再一次前台调用后台查询多个表,获取结果的过程中,我在controller里面开启线程池跑,同事查询多个表。每个线程run方法里面使用同一个request,然后通过request.getParameter()获取入参。多次查询总有那么1,2个线程...
  • 甚至颠覆了我们之前理解的JavaScript单线程 它提供了JavaScript多线程的解决方案 ...不过我们不用担心传统的多线程语言C++、Java等等遇到的多线程问题 下面我们就来看看什么是Web Worker工作线程专
  • 异步和多线程有什么区别

    万次阅读 热门讨论 2018-01-06 19:35:03
    一、异步和多线程有什么区别?其实,异步是目的,而多线程是实现这目的的方法。异步是说,A发起一操作后(一般都是比较耗时的操作,如果不耗时的操作就没有必要异步了),可以继续自顾自的处理它自己的事儿,...
  • 0. 准备工作 下面使用的restTemplate, 都是...我这里还使用了VisualVm Launcher的idea插件,来查看运行时的内存够和线程 1. 简单的下载文件 这里使用的是restTemplate调用getForEntity, 获取到字节数组, 再将字节数组...
  • 前端进阶(十八)js多线程

    千次阅读 2019-06-25 15:05:15
    HTML5引入Web Works,让js支持多线程。 一、多线程demo 1、先写一add函数 function(a, b){ if(a && b){ return a + b; } return 0; } 把这函数写到works,js中 2、使用web works的钩子函数...
  • java使用socket实现一个多线程web服务器除了服务器类,还包括请求响应类请求类:获取客户的HTTP请求,分析客户所需要的文件响应类:获得用户请求后将用户需要的文件读出,添加上HTTP应答头。发送给客户端。...
  • Java Web服务收到请求线程的情况

    千次阅读 多人点赞 2017-05-07 17:29:15
    Web请求线程的状态在开发中,突然想到了这样的一问题, Java对每一次Web的请求,是否都会创建一条线程去进行处理呢?也就是说,当一Class的方法同时有1000请求访问时,线程是如何运作的呢?解释上面的问题,...
  • 计算机网路实验二 多线程Web服务器的设计与实现 一、 实验目的及任务 1、实验目的 熟悉简单网络的搭建与基本配置; 熟悉socket、多线程编程; 熟悉JDK编程工具的基本使用; 熟悉HTTP协议; 熟悉Web服务器的基本工作...
  • Java 多线程(超详细)

    千次阅读 2021-01-12 21:14:38
    多线程学习思路:为什么学习线程?为了解决CPU利用率问题,提高CPU利用率。 =》 什么是进程?什么是线程? =》 怎么创建线程?有哪几种方式?有什么特点? =》 分别怎么启动线程? =》 多线程带来了数据安全问题,该...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 301,756
精华内容 120,702
关键字:

多个web请求和多线程的区别