# 进程:启动多个进程,进程之间是由操作系统负责调用
# 线程:启动多个线程,真正由被cpu执行的最小单位实际是线程
# 开启一个线程,创建一个线程,寄存器、堆栈
# 关闭一个线程
# 协程
# 本质上是一个线程
# 能够在多个任务之间来切换来节省一些IO时间
# 协程中任务之间的切换也消耗时间,但是开销要远远小于进程和线程之间的切换
# 实现并发的手段
def consumer():
while True:
x = yield
print('处理了数据:',x) def producer():
c = consumer()
next(c)
for i in range(10):
print('生成了数据:',i)
c.send(i)
producer()
# 真正的协程模块就是使用greenlet完成的切换

from greenlet import greenlet

def eat():
print('eating start')
g2.switch()
print('eating end')
g2.switch()
def play():
print('playing start')
g1.switch()
print('playing end')
g1 = greenlet(eat)
g2 = greenlet(play)
g1.switch()
from gevent import monkey;monkey.patch_all()
import time
import gevent
def eat():
print('eating start')
time.sleep(1)
print('eating end') def play():
print('playing start')
time.sleep(1)
print('playing end')
g1 = gevent.spawn(eat)
g2 = gevent.spawn(play)
g1.join()
g2.join()
# 同步和异步的列子
from gevent import monkey;monkey.patch_all()
import time
import gevent
def task():
time.sleep(1)
print(12345)
def sync():
for i in range(10):
task()
def async():
g_lst = []
for i in range(10):
g = gevent.spawn(task)
g_lst.append(g)
gevent.joinall(g_lst)
sync()
async()
# 协程:能够在一个线程中实现并发效果的概念
# 依赖于能够规避一些在任务中的IO操作
# 在任务的执行过程中检测到io就切换到其他任务
# 爬虫的例子
# 请求过程中的IO等待
from gevent import  monkey;monkey.patch_all()
import gevent
from urllib.request import urlopen
def get_url(url):
response = urlopen(url)
content = response.read().decode('utf-8')
return len(content) g1 = gevent.spawn(get_url,'http://www.baidu.com')
g2 = gevent.spawn(get_url,'http://www.taobao.com')
g3 = gevent.spawn(get_url,'http://www.sougou.com')
g4 = gevent.spawn(get_url,'http://www.hao123.com')
g5 = gevent.spawn(get_url,'http://www.cisco.com')
g6 = gevent.spawn(get_url,'http://www.cnblogs.com')
gevent.joinall([g1,g2,g3,g4,g5,g6])
print(g1.value)
print(g2.value)
print(g3.value)
print(g4.value)
print(g5.value)
print(g6.value)

socket-协程

#server
from gevent import monkey;monkey.patch_all()
import socket
import gevent def talk(conn):
conn.send(b'hello')
print(conn.recv(1024).decode('utf-8'))
conn.close()
sk = socket.socket()
sk.bind(('127.0.0.1',8080))
sk.listen()
while True:
conn,addr = sk.accept()
gevent.spawn(talk,conn)
sk.close()
#client
import socket
sk = socket.socket()
sk.connect(('127.0.0.1',8080))
print(sk.recv(1024))
msg = input('>>>>').encode('utf-8')
sk.send(msg)
sk.close()
协程 在一个线程上,提高cpu的利用率
# 协程相比多线程的优势。切换效率提高了
# 同步:提交一个任务之后要等待这个任务执行完毕;
# 异步:只管提交任务;不等待这个任务执行完毕就可以做其他事情
# 阻塞:recv recvfrom accept
# 非阻塞 # 阻塞 运行状态---阻塞状态---就绪状态

非阻塞IO方式实现socke#server

#server
import socket
sk = socket.socket()
sk.bind(('127.0.0.1',8080))
sk.setblocking(False)
sk.listen()
conn_l = []
del_conn = []
while True:
try:
conn,addr = sk.accept() #不阻塞,但是没有连我会报错
print('建立连接!',addr)
conn_l.append(conn) except BlockingIOError:
for con in conn_l:
try:
msg = con.recv(1024) #非阻塞,如果没有数据就报错
if msg == b'':
del_conn.append(con)
continue
print(msg)
conn.send(b'byebye')
except BlockingIOError:pass
for con in del_conn:
conn.close()
conn_l.remove(con)
del_conn.clear()
 
#client
import time
import socket
import threading
def func():
sk = socket.socket()
sk.connect(('127.0.0.1',8080))
sk.send(b'hello')
time.sleep(1)
print(sk.recv(1024))
sk.close()
for i in range(20):
threading.Thread(target=func).start()

IO多路复用-socket
#server
import socket
import select
sk = socket.socket()
sk.bind(('127.0.0.1',8080))
sk.setblocking(False)
sk.listen()
read_lst = [sk]
while True:
r_lst,w_lst,x_lst = select.select(read_lst,[],[])
for i in r_lst:
if i is sk:
conn,addr = i.accept()
read_lst.append(conn)
else:
ret = i.recv(1024)
if ret == b'':
i.close()
read_lst.remove(i)
continue
print(ret)
i.send(b'bybybybyby')
#client
import time
import socket
import threading
def func():
sk = socket.socket()
sk.connect(('127.0.0.1',8080))
sk.send(b'gogogog')
time.sleep(3)
print(sk.recv(1024))
sk.close()
for i in range(20):
threading.Thread(target=func).start()

Python9-IO模型-day41的更多相关文章

  1. 高性能IO模型浅析

    高性能IO模型浅析 服务器端编程经常需要构造高性能的IO模型,常见的IO模型有四种: (1)同步阻塞IO(Blocking IO):即传统的IO模型. (2)同步非阻塞IO(Non-blocking  ...

  2. 简述linux同步与异步、阻塞与非阻塞概念以及五种IO模型

    1.概念剖析 相信很多从事linux后台开发工作的都接触过同步&异步.阻塞&非阻塞这样的概念,也相信都曾经产生过误解,比如认为同步就是阻塞.异步就是非阻塞,下面我们先剖析下这几个概念分 ...

  3. Linux下常见的IO模型

    前言 阻塞IO(blocking IO) 非阻塞IO(nonblocking IO) IO复用(IO multiplexing) 异步IO(asynchronous IO (the POSIX aio ...

  4. IO模型

    前言 说到IO模型,都会牵扯到同步.异步.阻塞.非阻塞这几个词.从词的表面上看,很多人都觉得很容易理解.但是细细一想,却总会发现有点摸不着头脑.自己也曾被这几个词弄的迷迷糊糊的,每次看相关资料弄明白了 ...

  5. Linux下5种IO模型的小结

    概述 接触网络编程,我们时常会与各种与IO相关的概念打交道:同步(Synchronous).异步(ASynchronous).阻塞(blocking)和非阻塞(non-blocking).关于概念的区 ...

  6. 操作系统IO模型

    操作系统IO模型 声明:如下内容是根据APUE和mycat两本著作中关于I/O模式的一些内容加上自己的一些理解整理而成,仅供学习使用. 本节内容 UNIX下可用的五种I/O模型 三种I/O模型 Rea ...

  7. 同步异步,阻塞非阻塞 和nginx的IO模型

    同步与异步 同步和异步关注的是消息通信机制 (synchronous communication/ asynchronous communication).所谓同步,就是在发出一个*调用*时,在没有得 ...

  8. 几种服务器端IO模型的简单介绍及实现

    一些概念: 同步和异步 同步和异步是针对应用程序和内核的交互而言的,同步指的是用户进程触发I/O操作并等待或者轮询的去查看I/O操作是否就绪,而异步是指用户进程触发I/O操作以后便开始做自己的事情,而 ...

  9. Linux 网络编程(IO模型)

    针对linux 操作系统的5类IO模型,阻塞式.非阻塞式.多路复用.信号驱动和异步IO进行整理,参考<linux网络编程>及相关网络资料. 阻塞模式 在socket编程(如下图)中调用如下 ...

  10. Atitit  五种IO模型attilax总结 blocking和non-blocking synchronous IO和asynchronous I

    Atitit  五种IO模型attilax总结 blocking和non-blocking synchronous IO和asynchronous I   1.1. .3 进程的阻塞1 1.2. 网络 ...

随机推荐

  1. CentOS7.5搭建Hadoop分布式集群

    材料:3台虚拟主机,ip分别为: 192.168.1.201 192.168.1.202 192.168.1.203 1.配置主机名称 三个ip与主机名称分别对应关系如下: 192.168.1.201 ...

  2. css相关知识

    display: block; "块级元素". display: inline; "行内元素". display: none; "在不删除元素的情况下 ...

  3. 用mvc模式,整理前两次的代码并增加登陆注册

    简单的servlet连接mysql数据库 使用mvc的登录注册 commons-dbutils-1.6 mysql-connector-java-5.1.40-bin c3p0-0.9.5.2 mch ...

  4. eCharts图表(polar极坐标图)

    极坐标图 HTML: <div id="eChart"></div> css: #eChart{ width:500px; height:500px; } ...

  5. 网页游戏中PK系统的实现

    在游戏开发过程中,写过一个简单的PK系统面板,涉及到前端和后端的交互,我将自己制作的流程分享给大家,大概流程是这样:前端发送PK邀请给后端,后端受到请求后将信息返回给前端处理,先来看下整个流程图及思路 ...

  6. mstsc远程桌面全频或自定义窗口

    近期发现自己的mstsc突然窗口变小,总是要繁琐的拖来拖去,现终于解决了,拿来分享一二! 参数一:mstsc /f   以全屏模式显示(操作一次,后面无需在设置,具体何原因要问微软了,可能是机器的分辨 ...

  7. spring中用xml配置构造注入的心得

    spring中用xml配置构造注入时,如果 <constructor-arg> 属性都是 ref ,则不用理会参数顺序 <constructor-arg ref="kill ...

  8. ThinkPHP添加扩展配置失败

    扩展配置可以支持自动加载额外的自定义配置文件,并且配置格式和项目配置一样.设置扩展配置的方式如下(多个文件用逗号分隔): // 加载扩展配置文件 'LOAD_EXT_CONFIG' => 'us ...

  9. yii2 详细分解实现分页效果

    1.首先,准备一个数据表,内容为: 然后建立一个控制器,比如我的例子中的是:PractiseController.php 接着,我们开始在控制器中输入内容: 从中我们可以看到,这是将表数据中,id为2 ...

  10. java之打印机服务通俗做法

    javax.print包是API的主包,其中包含的类和接口能够让你:1)发现打印服务(Print Services)2)指定打印数据的格式 3)从一个打印服务创建打印工作(print jobs) 4) ...