一、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:
pass
client.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:
break
data_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)

二、基于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 = data
def 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()

  注:单纯用协程无用

  协程+遇到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/')
])

  总结:

    1什么是协程:

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

    2.协程可以提高并发么

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

      协程+IO切换性能提高

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

    4.单线程提高并发:

      协程+IO切换:gevent

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

twisted

from twisted.web.client import getPage, defer
from twisted.internet import reactor def 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()

python中IO多路复用、协程的更多相关文章

  1. Python异步IO之协程(一):从yield from到async的使用

    引言:协程(coroutine)是Python中一直较为难理解的知识,但其在多任务协作中体现的效率又极为的突出.众所周知,Python中执行多任务还可以通过多进程或一个进程中的多线程来执行,但两者之中 ...

  2. Python IO 多路复用 \协程

    IO 多路复用 作用:  检测多个socket是否已经发生变化(是否已经连接成功/是否已经获取数据) 即(可读/可写) IO请求时 解决并发  :  单线程 def get_data(key): cl ...

  3. IO多路复用,协程

    https://www.cnblogs.com/wangjun187197/p/9642429.html Python之路--协程/IO多路复用 I/O复用模型 此模型用到select和poll函数, ...

  4. Python异步IO之协程(二):使用asyncio的不同方法实现协程

    引言:在上一章中我们介绍了从yield from的来源到async的使用,并在最后以asyncio.wait()方法实现协程,下面我们通过不同控制结构来实现协程,让我们一起来看看他们的不同作用吧- 在 ...

  5. python中线程 进程 协程

    多线程:#线程的并发是利用cpu上下文的切换(是并发,不是并行)#多线程执行的顺序是无序的#多线程共享全局变量#线程是继承在进程里的,没有进程就没有线程#GIL全局解释器锁#只要在进行耗时的IO操作的 ...

  6. Python中进程线程协程小结

    进程与线程的概念 进程 程序仅仅只是一堆代码而已,而进程指的是程序的运行过程.需要强调的是:同一个程序执行两次,那也是两个进程. 进程:资源管理单位(容器). 线程:最小执行单位,管理线程的是进程. ...

  7. python中普通函数调用协程

    import asyncio def target(loop, timeout=None): future = asyncio.run_coroutine_threadsafe(add(1, b=2) ...

  8. python进阶——进程/线程/协程

    1 python线程 python中Threading模块用于提供线程相关的操作,线程是应用程序中执行的最小单元. #!/usr/bin/env python # -*- coding:utf-8 - ...

  9. 进程&线程(三):外部子进程subprocess、异步IO、协程、分布式进程

    1.外部子进程subprocess python之subprocess模块详解--小白博客 - 夜风2019 - 博客园 python subprocess模块 - lincappu - 博客园 之前 ...

随机推荐

  1. 创建 LVM

    1.将物理磁盘设备条带化为物理卷 # pvcreate /dev/sdb 查看物理卷: # pvs# pvdisplay 2.创建卷组,并添加 PV 到卷组 # vgcreate vg1 /dev/s ...

  2. linux 软连接【转】

    https://www.cnblogs.com/kex1n/p/5193826.html这是linux中一个非常重要命令,请大家一定要熟悉.它的功能是为某一个文件在另外一个位置建立一个同不的链接,这个 ...

  3. Ansible安装配置及命令使用详解

    Ansible和saltstack目前市面上一些其它的项目管理工具有很大的不同,它的设计初衷就是为了更方便.快捷的进行配置管理.它易于安装和使用.语法也非常简单易学.你可以用Ansible将平常复杂的 ...

  4. Asp.Net Core Identity中基于角色授权

    我们已经在之前介绍了简单的授权是在Controller或Action上添加属性Authorize来实现,那角色授权是在指定Authorize的同时指定Roles参数. 我们来看看基于角色访问的三种方式 ...

  5. 微信小程序之页面传值并且根据产品类别(主从关系)的赋值操作

    <view class="title"> <view class="titleName">{{cname}}</view> ...

  6. [C语言]给定直角三角形面积和斜边长

    [A题]   翘课的HugeGun_ 时间限制:1000ms   内存限制:65536kb 题目描述 HugeGun学姐很喜欢翘课.不幸的是,这一次她被发现了. 老师让她打扫了教室.当她把扫把靠在墙上 ...

  7. poj3348(求凸包面积)

    题目链接:https://vjudge.net/problem/POJ-3348 题意:转换题意后即是求凸包的面积. 思路: 套模板,求凸包面积即转换为多个三角形面积之和,用叉积求,然后除2,因为本题 ...

  8. 【转帖】linux date 显示指定时区的时间 借助TZ 环境变量 export TZ=Asia/Shanghai 或 America/New_York

    linux date 显示指定时区的时间 借助TZ 环境变量 export TZ=Asia/Shanghai 或 America/New_York 2015-02-10 10:58:22 youcha ...

  9. HDU 1016Presentation Error

    这是一道典型的DFS题目.幻想有n个箱子,每次都向箱子里扔一个数,(当然第一个是必定是1,因为题目要求按字典序输出).判断输出的条件就是,当我移动到第n+1个箱子的时候,就要return了,当然还要判 ...

  10. 转:Cesium 和 Webpack

    原文地址:https://www.jianshu.com/p/85917bcc023f 注意:webpack 和 webpack-cli 的安装参考 https://www.cnblogs.com/m ...