美文网首页
第三周总结

第三周总结

作者: IT大牛辉 | 来源:发表于2018-12-01 15:01 被阅读0次
    1.什么是多任务:

    简单地说,就是操作系统可以同时运行多个任务。比方说就是一个电脑在执行多个任务,如同时登陆QQ,微信,爱奇艺。这就是多任务。

    • 单核CPU如何执行多任务?
      单核CPU在同一时间只能执行一个进程,但是由于计算机的处理速度很快,所 以每个进程轮流执行一点就会让人感觉所有进程都在同时进行。

    • 多核CPU如何执行多任务?
      指的是任务数小于等于cpu核数,即任务真的是一起执行的

    2.线程

    • python的thread模块是比较底层的模块,python的threading模块是对thread做了一些包装的,可以更加方便的被使用
    import threading
    

    3.互斥锁

    • 在编程中,引入了对象互斥锁的概念,来保证共享数据操作的完整性。每个对象都对应于一个可称为" 互斥锁" 的标记,这个标记用来保证在任一时刻,只能有一个线程访问该对象

    • 互斥锁为资源引入一个状态:锁定/非锁定

    • 某个线程要更改共享数据时,先将其锁定,此时资源的状态为“锁定”,其他线程不能更改;直到该线程释放资源,将资源的状态变成“非锁定”,其他的线程才能再次锁定该资源。互斥锁保证了每次只有一个线程进行写入操作,从而保证了多线程情况下数据的正确性

    4.死锁问题

    • 在线程间共享多个资源的时候,如果两个线程分别占有一部分资源并且同时等待对方的资源,就会造成死锁。

    • 尽管死锁很少发生,但一旦发生就会造成应用的停止响应。

    5.进程以及状态

    1. 什么是进程 程序:
    进程:一个程序运行起来后,代码+用到的资源 称之为进程,它是操作系统分配资源的基本单元。

    不仅可以通过线程完成多任务,进程也是可以的

    2. 进程的状态

    工作中,任务数往往大于cpu的核数,即一定有一些任务正在执行,而另外一些任务在等待cpu进行执行,因此导致了有了不同的状态

    DeepinScrot-5453
    • 就绪态:运行的条件都已经慢去,正在等在cpu执行
    • 执行态:cpu正在执行其功能
    • 等待态:等待某些条件满足,例如一个程序sleep了,此时就处于等待态

    6.进程间通信-Queue:

    Process之间有时需要通信,操作系统提供了很多机制来实现进程间的通信。

    1. Queue的使用 可以使用multiprocessing模块的Queue实现多进程之间的数据传递,Queue本身是一个消息列队程序
    • 下面是一些Queue的参数
        Queue.qsize():返回当前队列包含的消息数量;
    
        Queue.empty():如果队列为空,返回True,反之False ;
    
        Queue.full():如果队列满了,返回True,反之False;
    
        Queue.get(block, timeout):获取队列中的一条消息,然后将其从列队中移除,block默认值为True;
    
    
    进程与线程的对比:

    进程、线程对比 功能

    进程,能够完成多任务,比如 在一台电脑上能够同时运行多个QQ
    线程,能够完成多任务,比如 一个QQ中的多个聊天窗口
    

    7.迭代器

    • 迭代是访问集合元素的一种方式。迭代器是一个可以记住遍历的位置的对象。迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。

    • 可迭代对象 我们已经知道可以对list、tuple、str等类型的数据使用for...in...的循环语法从其中依次拿到数据进行使用,我们把这样的过程称为遍历,也叫迭代。

    可迭代对象和迭代器的本质
    • 一个具备了 iter 方法的对象,就是一个 可迭代对象
    • 一个实现了iter方法和next方法的对象,就是迭代器。
    8.生成器
      1. 生成器 利用迭代器,我们可以在每次迭代获取数据(通过next()方法)时按照特定的规律进行生成。但是我们在实现一个迭代器时,关于当前迭代到的状态需要我们自己记录,进而才能根据当前状态生成下一个数据。为了达到记录当前状态,并配合next()函数进行迭代使用,我们可以采用更简便的语法,即生成器(generator)。生成器是一类特殊的迭代器。
    • 2.只要在def中有yield关键字的 就称为 生成器
    • 使用了yield关键字的函数不再是函数,而是生成器。(使用了yield的函数就是生成器)
    • yield关键字有两点作用:
            保存当前运行状态(断点),然后暂停执行,即将生成器(函数)挂起
            将yield关键字后面表达式的值作为返回值返回,此时可以理解为起到了
    
    • return的作用
      可以使用next()函数让生成器从断点处继续执行.

    9.协程

    • 协程(coroutine)也是一种程序组件。相对子例程而言,协程更为一般和灵活,但在实践中使用没有子例程那样广泛

    总结:

     1.进程是资源分配的单位
    
    2.线程是操作系统调度的单位
    
    3.进程切换需要的资源很最大,效率很低
    
    4.线程切换需要的资源一般,效率一般(当然了在不考虑GIL的情况下)
    
    5.协程切换任务资源很小,效率高
    
    6.多进程、多线程根据cpu核数不一样可能是并行的,但是 协程 是在一个 线程中 所以是 并发的.
    

    10.selenium

    • Selenium是一个Web的自动化测试工具,最初是为网站自动化测试而开发的,类型像我们玩游戏用的按键精灵,可以按指定的命令自动操作,不同是Selenium 可以直接运行在浏览器上,它支持所有主流的浏览器(包括PhantomJS这些无界面的浏览器)。

    11.PhantomJS

    • PhantomJS 是一个基于Webkit的“无界面”(headless)浏览器,它会把网站加载到内存并执行页面上的 JavaScript,因为不会展示图形界面,所以运行起来比完整的浏览器要高效。

    12.Scrapy 框架

    • Scrapy是用纯Python实现一个为了爬取网站数据、提取结构性数据而编写的应用框架,用途非常广泛。
    • 框架的力量,用户只需要定制开发几个模块就可以轻松的实现一个爬虫,用来抓取网页内容以及各种图片,非常之方便。
    • Scrapy 使用了 Twisted['twɪstɪd] 异步网络框架来处理网络通讯,可以加快我们的下载速度,不用自己去实现异步框架,并且包含了各种中间件接口,可以灵活的完成各种需求。
      异步:调用在发出之后,这个调用就直接返回,不管有无结果 非阻塞:关注的是程序在等待调用结果(消息,返回值)时的状态,指在不能立刻得到结果之前,该调用不会阻塞当前线程
    Scrapy架构图(绿线是数据流向):
    8986d6be-2de6-47b6-9318-e6822b63bb08.png
    • Scrapy Engine(引擎): 负责Spider、ItemPipeline、Downloader、Scheduler中间的通讯,信号、数据传递等。

    • Scheduler(调度器): 它负责接受引擎发送过来的Request请求,并按照一定的方式进行整理排列,入队,当引擎需要时,交还给引擎。

    • Downloader(下载器):负责下载Scrapy Engine(引擎)发送的所有Requests请求,并将其获取到的Responses交还给Scrapy Engine(引擎),由引擎交给Spider来处理,

    • Spider(爬虫):它负责处理所有Responses,从中分析提取数据,获取Item字段需要的数据,并将需要跟进的URL提交给引擎,再次进入Scheduler(调度器),

    • Item Pipeline(管道):它负责处理Spider中获取到的Item,并进行进行后期处理(详细分析、过滤、存储等)的地方.

    • Downloader Middlewares(下载中间件):你可以当作是一个可以自定义扩展下载功能的组件。

    • Spider Middlewares(Spider中间件):你可以理解为是一个可以自定扩展和操作引擎和Spider中间通信的功能组件(比如进入Spider的Responses;和从Spider出去的Requests)

    相关文章

      网友评论

          本文标题:第三周总结

          本文链接:https://www.haomeiwen.com/subject/iozlcqtx.html