zoukankan      html  css  js  c++  java
  • Python3.5 学习十

    多进程:

    多线程和多进程的区别:

    Python多线程不适合CPU操作密集型的任务,适合IO操作密集型的任务(IO操作不占用CPU)

    Python折中解决多线程不能真正同步运算的方案是:起多个进程,每个进程中的线程都可以同时在多核中运行,缺点是不能共享内存数据。

    协程:微线程,用户自己控制,CPU不切换。举例:yield就是协程的一种实现

      遇到IO操作就切换

    Gevent是一个第三方库,可以轻松通过gevent实现高效同步或异步编程。在Gevent中用到的主要模式是Greenlet。它是以C扩展模块形式接入Python的轻量级协程。Greenlet全部运行在主程序操作系统的进程内部。但他们被协作式的调度。

    论事件驱动与异步IO:

    通常,我们写服务器处理模型的程序时,有以下几种模型:

    1 每收到一个请求,都启动一个进程

    2 每收到一个请求,都启动一个线程

    3 每收到一个请求,放入一个事件列表,让主进程通过非阻塞I/O方式来处理请求(协程)

    上面几种方式:各有千秋:

    1,由于创建新的进程的开销比较大,所以会导致服务器性能比较差,但实现比较简单。

    2,由于要设计到线程的同步,有可能会面临死锁等问题。

    3,在写应用程序代码是,逻辑比前两种都复杂。

    综合考虑各方面因素,一般普通使用第三种方式进行网络服务器程序编写

    在Linux下分析Socket多并发各种实现模型的效率分析:

    1  阻塞模型  在数据接收时等待、等待数据从内核内存copy到用户内存中等待时会卡住

    2  非阻塞模型  在等待数据从内核内存copy到用户内存中等待时会卡住

    3  同步/O多路复用  就是我们说的select,poll,epoll,有些地方也成这种IO方式为event driven IO。select/epoll的好处就是在于单个process就可以同时处理多个网络连接的IO。它的基本原理就是select,poll,epoll这个function会不断的轮训所负责的所有socket,当某个socket有数据到达了,就通知用户进程。

    4  信号驱动IO  在请求数据时,给予请求,不需要等待,可以做其他事情,带请求数据准备好了,回送一个信号以驱动再次过来取数据。

    5  异步IO  其实用的很少,先看一下它的进程:

      只需告知要求数据的请求,然后请求进程就可以去做自己的事情,服务器会帮助请求数据,数据从系统内核转存到用户内存,然后送给请求的进程,最后给进程发送一个完成的信号。效率达到最高。

    异步IO实例:select解析Socket实例  请参见80180814 

          另一种实现:用selectors实现

    本节作业:  用select或者selectors完成FTP上传下载的多并发效果

  • 相关阅读:
    springboot mail+Thymeleaf模板
    jax-rs示例
    java enum的一种写法记录
    lintcode 最大子数组III
    lintcode 单词接龙II
    idea springboot热部署无效问题
    java8 Optional正确使用姿势
    Spring根据包名获取包路径下的所有类
    无状态shiro认证组件(禁用默认session)
    获取资源文件工具类
  • 原文地址:https://www.cnblogs.com/HU-HU/p/9456187.html
Copyright © 2011-2022 走看看