一、IO多路复用
    IO多路复用:检测多个socket是否已经发生变化(是否已经连接成功/是否已经获取数据)(可读/可写)

import socket
def get_data(key):client = socket.socket()client.setblocking(False)   #将原阻塞的位置变成非阻塞try:client.connect(("www.baidu.com",80))    #因为没有等待所以会报错except BlockingIOError as e:passclient.sendall(b"GET /s?wd=%s HTTP/1.0\r\nhost:www.baidu.com\r\n\r\n" %key)data_list = []while 1:data = client.recv(8096)if not data:breakdata_list.append(data)data = b"".join(data_list)print(data.decode("utf8"))
key_list = ["alex","sb","db"]
for item in key_list:get_data(item)

View Code

二、基于IO多路复用+socket实现并发请求
  IO多路复用
  socket非阻塞
  基于事件循环实现的异步非阻塞框架
    非阻塞:不等待
    异步:执行完某个人物后自动调用我给他的函数。
      Python中开源 基于事件循环实现的异步非阻塞框架 Twisted

    总结:
      1. socket默认是否是阻塞的?阻塞体现在哪里?
          是,connect、accept、recv
      2. 如何让socket编程非阻塞?
          setblocking(False)
      3. IO多路复用作用?
        检测多个socket是否发生变化。
        操作系统检测socket是否发生变化,有三种模式:
          select:最多1024个socket;循环去检测。
          poll:不限制监听socket个数;循环去检测(水平触发)。
          epoll:不限制监听socket个数;回调方式(边缘触发)。
        Python模块:
          select.select
          select.epoll

      4. 提高并发方案:
        - 多进程
        - 多线程
        - 异步非阻塞模块(Twisted) scrapy框架(单线程完成并发)

      5. 什么是异步非阻塞?
        - 非阻塞,不等待。
          比如创建socket对某个地址进行connect、获取接收数据recv时默认都会等待(连接成功或接收到数据),才执行后续操作。
          如果设置setblocking(False),以上两个过程就不再等待,但是会报BlockingIOError的错误,只要捕获即可。
        - 异步,通知,执行完成之后自动执行回调函数或自动执行某些操作(通知)。

      6. 什么是同步阻塞?
        - 阻塞:等
        - 同步:按照顺序逐步执行
        key_list = ['alex','db','sb']
        for item in key_list:
          ret = requests.get('https://www.baidu.com/s?wd=%s' %item)
          print(ret.text)

      7.概念 

#以前
v = [[11,22],[33,44],[55,66]] #每一个都有一个append方法
for item in v:print(item.append(1))
#以后
class Foo(object):def __init__(self,data):self.data = datadef append(self,ietm):self.data.appded(item)
v = [[11,22],[33,44],[55,66]]
for item in v:print(item.append(1))

面向对象的思想

三、协程

    概念:

      进程、操作系统中存在

      线程、操作系统中存在

      协程、是由程序员创造出来的一个不是真实存在的东西

  协程:是微线程,是对一个线程进行分片,使得线程在代码块之间来回切回执行,而不是在原来逐行执行

import greenlet
def f1():print(11)gr2.switch()print(22)gr2.switch()
def f2():print(33)gr1.switch()print(44)
#协程gr1
gr1 = greenlet.greenlet(f1)
#协程gr2
gr2 = greenlet.greenlet(f2)
gr1.switch()

View Code

  注:单纯用协程无用

  协程+遇到IO就切换,才真的有用  pip3 install gevent

import gevent
from gevent import monkey
monkey.patch_all()
import requests
def get_page1(url):ret = requests.get(url)print(url,ret.content)
def get_page2(url):ret = requests.get(url)print(url,ret.content)
def get_page3(url):ret = requests.get(url)print(url,ret.content)
gevent.joinall([gevent.spawn(get_page1, 'https://www.python.org/'),gevent.spawn(get_page2, 'https://www.yahoo.com/'),gevent.spawn(get_page3, 'https://github.com/')])

View Code

  总结:

    1什么是协程:

      协程也可以成为微线程,基石开发者控制线程执行流程,控制先执行某段代码然后在切换到另外函数执行代码

    2.协程可以提高并发么

      协程自己本身无法实现并发(甚至性能会降低)

      协程+IO切换性能提高

    3.进程、线程、协程的区别

    4.单线程提高并发:

      协程+IO切换:gevent

      基于事件循环的异步非阻塞框架:Twisted

twisted

from twisted.web.client import getPage, defer
from twisted.internet import reactordef all_done(arg):reactor.stop()def callback(contents):print(contents)deferred_list = []
url_list = ['http://www.bing.com', 'http://www.baidu.com', ]
for url in url_list:deferred = getPage(bytes(url, encoding='utf8'))deferred.addCallback(callback)deferred_list.append(deferred)dlist = defer.DeferredList(deferred_list)
dlist.addBoth(all_done)reactor.run()

View Code

转载于:https://www.cnblogs.com/qq849784670/p/9641711.html

python中IO多路复用、协程相关推荐

  1. python协程是什么_在python中线程和协程的区别是什么

    在python中线程和协程的区别:1.一个线程可以拥有多个协程,这样在python中就能使用多核CPU:2.线程是同步机制,而协程是异步:3. 协程能保留上一次调用时的状态,每次过程重入时,就相当于进 ...

  2. Python 异步 IO 、协程、asyncio、async/await、aiohttp

    From :廖雪峰 异步IO :https://www.liaoxuefeng.com/wiki/1016959663602400/1017959540289152 Python Async/Awai ...

  3. Python之进程+线程+协程(异步、selectors模块、阻塞、非阻塞IO)

    文章目录 一.IO多路复用 二.selectors模块 本篇文字是关于IO多路复用的更深入一步的总结,上一篇 Python之进程+线程+协程(事件驱动模型.IO多路复用.select与epoll)对I ...

  4. python并发编程:协程asyncio、多线程threading、多进程multiprocessing

    python并发编程:协程.多线程.多进程 CPU密集型计算与IO密集型计算 多线程.多进程与协程的对比 多线程 创建多线程的方法 多线程实现的生产者-消费者爬虫 Lock解决线程安全问题 使用线程池 ...

  5. python并发编程之协程

    python并发编程之协程 1.协程: 单线程实现并发 在应用程序里控制多个任务的切换+保存状态 优点: 应用程序级别速度要远远高于操作系统的切换 缺点: 多个任务一旦有一个阻塞没有切,整个线程都阻塞 ...

  6. python asyncio教程_Python 协程模块 asyncio 使用指南

    Python 协程模块 asyncio 使用指南 前面我们通过5 分钟入门 Python 协程了解了什么是协程,协程的优点和缺点和如何在 Python 中实现一个协程.没有看过的同学建议去看看.这篇文 ...

  7. 服务端异步IO配合协程浅析

    服务端异步IO配合协程浅析 代码如下 #coding:utf-8 import socket from selectors import DefaultSelector, EVENT_READ, EV ...

  8. go test 如何输出到控制台_深度剖析 Go 中的 Go 协程 (goroutines) -- Go 的并发

    Go 协程 (goroutine) 是指在后台中运行的轻量级执行线程,go 协程是 Go 中实现并发的关键组成部分. 在上次的课程中,我们学习了 Go 的并发模型.由于 Go 协程相对于传统操作系统中 ...

  9. python中IO编程中关于StringIO的读写问题

    阅读前请看一下:我是一个热衷于记录的人,每次写博客会反复研读,尽量不断提升博客质量.文章设置为仅粉丝可见,是因为写博客确实花了不少精力.希望互相进步谢谢!! 文章目录 阅读前请看一下:我是一个热衷于记 ...

最新文章

  1. Android View 测量流程(Measure)完全解析
  2. 最新版mac使用m1芯片,使用nvm安装低版本的node报错问题
  3. ACM练习 小Z来讲排名规则(WA)【C++ stable_sort稳定排序】
  4. mysql 注入 file load_Mysql注入中into outfile和load_file()总结
  5. spring 之 property-placeholder 分析
  6. 没错,你离分布式搜索只差一个Elasticsearch入门!
  7. 微信小程序|area组件使用的地址数据文件plus
  8. Openresty 学习笔记(一)opm 工具的使用
  9. 虚拟机ubuntu 网速慢的解决方法
  10. 【动态规划】完全背包问题:构成m的最少个数
  11. linux指令-动态查看系统资源情况
  12. dreamweaver php代码提示框,PHP 5.4中的Dreamweaver CS5代码提示和语法错误
  13. PDF怎么转换成Word?来看这两个方法
  14. 在运行java程序时出现 Error: could not open c:\program Files\Java\jre6\lib\amd64\jvm.cfg'
  15. GBase 8c开发接口简述
  16. python培训班价格-少儿编程培训机构哪家好,儿童编程价格多少钱?家长知多少...
  17. 大型企业AD架构规划(一)
  18. QSettings 读写注册表、配置文件
  19. 神器 工具 推荐 SRDebugger
  20. 农产品追溯管理软件开发

热门文章

  1. linkscrpit
  2. SpringCloud学习成长之路七 高可用配置中心
  3. 对anagrams分组 Group Anagrams
  4. 面向对象设计模式纵横谈:Prototype 原型模式(笔记记录)
  5. input type=file accept中可以限制的文件类型
  6. UVALive 4223 Trucking 二分+spfa
  7. logstash 收集windows日志--解决日志不能重命名问题
  8. 灵活理解思科三层结构
  9. 如何停止Linux系统中占用CPU 100%的进程
  10. 好程序员分享24个canvas基础知识小结 1