回调函数

进程与线程

醉酒当歌 提交于 2019-11-27 12:34:01
进程与线程   1.进程:程序的一次执行, 它占有一片独有的内存空间   2.线程: CPU的基本调度单位, 是程序执行的一个完整流程   3. 进程与线程 一个进程中一般至少有一个运行的线程: 主线程 一个进程中也可以同时运行多个线程, 我们会说程序是多线程运行的 一个进程内的数据可以供其中的多个线程直接共享 多个进程之间的数据是不能直接共享的   4. 如何查看浏览器是否是多进程运行的呢?       任务管理器==>进程 浏览器运行是单线程还是多线程?        都是多线程运行的 JS单线程执行   1.如何证明js执行是单线程的? setTimeout()的回调函数是在主线程执行的 定时器回调函数只有在运行栈中的代码全部执行完后才有可能执行    2.为什么js要用单线程模式, 而不用多线程模式? JavaScript的单线程,与它的用途有关。 作为浏览器脚本语言,JavaScript的主要用途是与用户互动,以及操作DOM。 这决定了它只能是单线程,否则会带来很复杂的同步问题    3.代码的分类: 初始化代码 回调代码   4.js引擎执行代码的基本流程 先执行初始化代码: 包含一些特别的代码 回调代码(异步执行) 设置定时器 绑定监听 发送ajax请求 后面在某个时刻才会执行回调代码 事件循环模型 所有代码分类 初始化执行代码(同步代码): 包含绑定dom事件监听,

高并发服务器epoll接口、epoll Reactor(反应堆)模型详解

核能气质少年 提交于 2019-11-27 12:14:50
epoll接口是为解决Linux内核处理大量文件描述符而提出的方案。该接口属于Linux下多路I/O复用接口中select/poll的增强。其经常应用于Linux下高并发服务型程序,特别是在大量并发连接中只有少部分连接处于活跃下的情况 (通常是这种情况),在该情况下能显著的提高程序的CPU利用率。 epoll采用的是事件驱动,并且设计的十分高效。在用户空间获取事件时,不需要去遍历被监听描述符集合中所有的文件描述符,而是遍历那些被内核I/O事件异步唤醒之后加入到就绪队列并返回到用户空间的描述符集合。 epoll提供了两种触发模式,水平触发(LT)和边沿触发(ET)。当然,涉及到I/O操作也必然会有阻塞和非阻塞两种方案。目前效率相对较高的是 epoll+ET+非阻塞I/O 模型,在具体情况下应该合理选用当前情形中最优的搭配方案。 接下来的讲解顺序为: (1) epoll接口的一般使用 (2) epoll接口 + 非阻塞 (3) epoll接口 + 非阻塞 + 边沿触发 (4) epoll反应堆模型 (重点,Libevent库的核心思想) 一、epoll接口的基本思想概述 epoll的设计: (1)epoll在Linux内核中构建了一个文件系统,该文件系统采用红黑树来构建,红黑树在增加和删除上面的效率极高,因此是epoll高效的原因之一。有兴趣可以百度红黑树了解

进程池 线程池 协程 UTC并发

橙三吉。 提交于 2019-11-27 10:57:50
一、进程、线程池 #为什么用 开进程开线程都需要消耗资源消耗时间的,只不过两者比较的情况线程消耗的资源比较少 在成千上万个任务需要被执行的时候,我们可以去创建成千上万个进程么? 就算你比较二,建了无数个进程线程,系统敢让你执行么?除非它自己不要命了,辛辛苦苦创建出来还不能执行,气不气? 我们需要一个池子,根据计算机状况最大限度的限制进程线程数量,在计算机能够承受范围之内最大限度的利用计算机 #什么是池? (硬件的发展跟不上软件的速度) 池其实是降低了程序的运行效率 但是保证了计算机硬件的安全 最大限度的限制进程线程数量,在保证计算机硬件安全的情况下最大限度的利用计算机 #提交任务的方式:           同步: 提交任务之后 原地等待任务的返回结果 期间不做任何事           异步: 提交任务之后 不等待任务的返回结果(异步的结果怎么拿???) 直接执行下一行代码            异步回调机制 :当异步提交的任务有返回结果之后,会自动触发回调函数的执行 #创建的特点 池子中创建的进程/线程创建一次就不会再创建了 至始至终用的都是最初的那几个 这样的话节省了反复开辟进程/线程的资源 1.进程池 池中默认进程数: cpu个数 from concurrent.futures import ProcessPoolExecutor import time import os

进程池、线程池

狂风中的少年 提交于 2019-11-27 10:38:37
  开进程开线程都需要消耗资源,线程消耗比进程消耗低,能在计算机承受范围之内最大的利用计算机。 线程池与进程池   池是在保证计算机硬件安全的情况下最大限度的利用计算机,其实就是为了保护计算机硬件的安全,降低了程序的运行效率。 from concurrent.futures import ThreadPoolExecutor,ProcessPoolExecutor import time import os # pool = ThreadPoolExecutor(5) # 括号内可以传参数指定线程池内的线程个数 # # 也可以不传 不传默认是当前所在计算机的cpu个数乘5 pool = ProcessPoolExecutor() # 默认是当前计算机cpu的个数 """ 池子中创建的进程/线程创建一次就不会再创建了 至始至终用的都是最初的那几个 这样的话节省了反复开辟进程/线程的资源 """ def task(n): print(n,os.getpid()) # 查看当前进程号 time.sleep(2) return n**2 def call_back(n): print('拿到了异步提交任务的返回结果:',n.result()) """ 提交任务的方式 同步:提交任务之后 原地等待任务的返回结果 期间不做任何事 异步:提交任务之后 不等待任务的返回结果(异步的结果怎么拿???

libevent源码分析一--io事件响应

喜夏-厌秋 提交于 2019-11-27 10:31:14
这篇文章将分析libevent如何组织io事件,如何捕捉事件的发生并进行相应的操作。这里不会详细分析event与event_base的细节,仅描述io事件如何存储与如何响应。 1. select libevent的实现io事件的backend实际上使用的是io复用接口,如select, poll, epoll等,这里以最简单的select为例进行说明。首先简单介绍一下select接口: int select(int nfds, fd_set *readfds, fd_set *writefds,fd_set *exceptfds, struct timeval *timeout); readfds, writefds, exceptfds均是文件描述符集合,调用该函数后,若readfds集合中的fd可读,或者writefds集合中的fd可写,或者exceptfds集合中的fd发生错误,或者阻塞的时间达到了timeout,函数返回。 函数返回0,返回结果readfds集合中包含了入参readfds中现在读不会被阻塞的fd,返回结果writefds包含了对应的写不会被阻塞的fd,exceptfds包含了所有发生异常的fd。如果超时,函数返回-1,这些集合为空。 可以看到,select调用需要传入感兴趣的io的文件描述符fd,而libevent中大家熟悉的是event_base

进程池和线程池、协程

岁酱吖の 提交于 2019-11-27 10:19:17
一、进程池和线程池 当被操作对象数目不大时,我们可以手动创建几个进程和线程,十几个几十个还好,但是如果有上百个上千个。手动操作麻烦而且电脑硬件跟不上,可以会崩溃,此时进程池、线程池的功效就能发挥了。我们可以通过维护一个进程池、线程池来控制进程数目和线程数目。在保证计算机硬件安全的情况下最大限度的利用计算机,池其实是降低了程序的运行效率,但是保证了计算机硬件的安全。 注意点:在使用进程池、线程池,Pool可以提供指定数量的进程,线程,供用户调用,当有新的请求提交到pool中时,如果池还没有满,那么就会创建一个新的进程,线程用来执行该请求,但如果池中的进程,线程数量已经达到规定的最大值,那么该请求就会等待,直到池中有进程,线程结束,就重新使用进程池、线程池中的进程,线程。 池子中创建的进程/线程创建一次就不会再创建了,至始至终都是使用最初的那几个,这样的话节省了反复开辟进程/线程的资源(******) 主要方法: pool.submit(task,1) #朝池子中提交任务 异步提交 task是函数,1是task的参数 pool.shutdown() #关闭池子 等待池子中所有任务执行完毕之后才会往下运行代码 线程池和进程池创建的方法一样只是导入的模块不一样 回调函数add_done_callback,我们可以把耗时间(IO操作)的任务放在进程池中,然后指定回调函数(主进程负责执行)

线程进程池,协程,IO模型

牧云@^-^@ 提交于 2019-11-27 10:16:32
1. 线程进程池    1.池: 在保证计算机硬件安全的情况下最大限度的使用计算机硬件,池其实是降低了程序的运行效率,但是保证了计算机硬件的安全(硬件的发展跟不上软件发展的速度)   2: 线程池与进程池: 开线程和进程都需要消耗资源,只不过两者比较情况下线程消耗的资源比较少,使用进程池与线程池能在计算机能承受的范围内最大限度的使用计算机   3: 在python中开线程池与进程池需要导入concurrent.futurs 标准模块 #1 介绍 concurrent.futures模块提供了高度封装的异步调用接口 ThreadPoolExecutor:线程池,提供异步调用 ProcessPoolExecutor: 进程池,提供异步调用 Both implement the same interface, which is defined by the abstract Executor class. #2 基本方法 #submit(fn, *args, **kwargs) 异步提交任务 #map(func, *iterables, timeout=None, chunksize=1) 取代for循环submit的操作 #shutdown(wait=True) 相当于进程池的pool.close()+pool.join()操作 wait=True

协程

北战南征 提交于 2019-11-27 10:10:25
一、进程池线程池介绍   1.开线程和开进程都是要消耗资源的,只不过线程消耗的资源较少一点   2.概念:硬件有极限,为了减轻硬件压力,所以有了池的概念   3.什么是池?     在保证计算机硬件安全的情况下最大限度的利用计算机     池其实是降低了程序的运行效率,但是保证了计算机硬件的安全     (硬件的发展跟不上软件的速度)   4.操作步骤     (1)concurrent.futures模块导入     (2)线程池创建(线程数=cpu核数*5左右)     (3)submit提交任务(提交任务的两种方式)     (4)异步提交的submit返回值对象     (5)shutdown关闭池并等待所有任务运行结束     (6)对象获取任务返回值     (7)进程池的使用,验证进程池在创建的时候里面固定有指定的进程数     (8)异步提交回调函数的使用   5.pool = ThreadPoolExecutor(5)  括号内可以传参数指定线程池内的线程个数     也可以不传,默认为当前所在计算机的cpu个数乘5     pool = ProcessPoolExecutor()  默认是当前计算机cpu的个数     add_done_callback()  绑定一个回调函数   6.提交任务的方式:     同步:提交任务之后,原地等待任务的返回结果

nodejs的事件轮询机制

跟風遠走 提交于 2019-11-27 09:28:24
//process.nextTick( ) setTimeout( ) setImmediate( ) // nodejs的事件轮询机制: 借助libuv库来实现的 事件轮询机制主要分为 六个阶段 : 1.timers 计时器阶段   计时和执行到点的定时器回调函数 2.pending callbacks   某些系统操作(如tcp错误类型)的回调函数 3.idle ,prepare   准备工作 4.poll 轮询阶段(轮询队列)   如果轮询队列不为空,依次同步取出轮询队列中第一个回调执行,知道轮询队列为空或者达到系统最大的限制   如果轮询队列为空     如果之前设置过setImmediate函数       直接进入下一个check阶段     如果之前没有设置过setImmediate函数       在当前poll阶段等待         直到轮询队列添加回调函数,就去第一个情况执行         如果定时器到点了,也会去下一个阶段 5.check 查阶段   执行setImmediate设置的回调函数 6.close callbacks 关闭阶段   执行close时间回调函数 关于 process.nextTick 能在任意优先阶段先执行 来源: https://www.cnblogs.com/BR-Tao/p/11355904.html