1.协程
并发:切+保存状态
单线程下实现并发:协程 切+ 保存状态 yield
遇到io切,提高效率
遇到计算切,并没有提高效率 检测单线程下 IO行为 io阻塞 切
相当于骗操作系统 一直处于计算
协程:。。。
单线程下实现并发:根本目标:遇到IO就切,一个线程的整体IO降下来
程序用的cpu 时间长,就叫执行效率高
效率最高:多个进程 (多个cpu)
每个进程开多个线程
每个线程用到协程 (IO就切)
总结协程特点:
 #并发执行
import time def producer():
g=consumer()
next(g)
for i in range(10000000): # 计算
g.send(i) def consumer():
while True:
res=yield start_time=time.time()
producer()
stop_time=time.time()
print(stop_time-start_time) #串行
import time def producer():
res=[]
for i in range(10000000):
res.append(i)
return res def consumer(res):
pass start_time=time.time()
res=producer()
consumer(res)
stop_time=time.time()
print(stop_time-start_time)
2.greenlet模块
pip3 install greenlet
greenlet:可以很方便的切 但不能检测到 遇到IO 切
greenlet 比yield 好 但是还是不好 遇到io不会切
 from greenlet import greenlet
import time def eat(name):
print('%s eat 1' %name)
time.sleep(10) # 遇到io 不会立即切
g2.switch('egon')
print('%s eat 2' %name)
g2.switch() def play(name):
print('%s play 1' %name )
g1.switch()
print('%s play 2' %name ) g1=greenlet(eat)
g2=greenlet(play) g1.switch('egon') # 第一次切 需要传参数
3.gevent模块
pip3 install gevent
gevent:封装了greenlet模块,但是他能检测到io 自动切
只能检测到gevent.sleep() gevent的IO阻塞
加上补丁后,就可以检测到所有的IO 原理是:将阻塞变为非阻塞
from gevent import monkey;monkey.patch_all()
这种形式的协程 才能帮我们提升效率 从始至终 就一个线程
gevent.joinall([g1,g2]) 等待全部执行完 gevent 模块:监测单线程下多个任务得IO行为实现遇到IO就自动切到另一个任务去执行
提升单线程运行效率
应用场景:单线程下多个任务io密集型
ftp io密集型 线程来回切 比os q切 小路高
 from gevent import monkey;monkey.patch_all()  # 一定要放在程序的开头 检测所以的io 将阻塞变成非阻塞
import gevent
import time def eat(name):
print('%s eat 1' % name)
time.sleep(3) # 7s多一些 gevent 只识别 gevent 的 io操作
# gevent.sleep(3) # 4s 多一些
print('%s eat 2' % name) def play(name):
print('%s play 1' % name)
time.sleep(4)
# gevent.sleep(4)
print('%s play 2' % name) start_time=time.time()
g1=gevent.spawn(eat,'egon')
g2=gevent.spawn(play,'alex') g1.join()
g2.join()
stop_time=time.time()
print(stop_time-start_time)
"""
egon eat 1
alex play 1
egon eat 2
alex play 2
4.001747369766235 """
"""
egon eat 1
egon eat 2
alex play 1
alex play 2
7.0017828941345215
"""
"""
egon eat 1
alex play 1
egon eat 2
alex play 2
4.001675367355347
""" from gevent import monkey;monkey.patch_all()
import gevent
import time def eat(name):
print('%s eat 1' % name)
time.sleep(3)
print('%s eat 2' % name) def play(name):
print('%s play 1' % name)
time.sleep(4)
print('%s play 2' % name) g1=gevent.spawn(eat,'egon') # 异步操作
g2=gevent.spawn(play,'alex') # time.sleep(5) # 得等到 全部执行完 # g1.join() # 等到 全部执行完
# g2.join() gevent.joinall([g1,g2]) # 等到g1 g2 全部执行完
"""
egon eat 1
alex play 1
egon eat 2
alex play 2
"""
4.gevent实现并发的套接字通信
# 500 客户端同时 登录 服务端:这里1个线程 抗住了 500个client
# 这里也说明了:单线程下面io问题降下来,效率大幅度提高 说明
使用:多进程
多线程
一个线程io 问题解决了 效率大大得提高
服务端:
 #基于gevent实现
from gevent import monkey,spawn;monkey.patch_all()
from socket import * def communicate(conn):
while True:
try:
data=conn.recv(1024)
if not data:break
conn.send(data.upper())
except ConnectionResetError:
break conn.close() def server(ip,port):
server = socket(AF_INET, SOCK_STREAM)
server.bind((ip,port))
server.listen(5) while True:
conn, addr = server.accept()
spawn(communicate,conn) # 这里没必要加join server.close() if __name__ == '__main__':
g=spawn(server,'127.0.0.1',8090)
g.join()
客户端:
 from socket import *
from threading import Thread,currentThread def client(): #
client=socket(AF_INET,SOCK_STREAM)
client.connect(('127.0.0.1',8090)) while True:
client.send(('%s hello' %currentThread().getName()).encode('utf-8'))
data=client.recv(1024)
print(data.decode('utf-8')) client.close() # 500 客户端同时 登录 服务端:这里1个线程 抗住了 500个client
# 这里也说明了:单线程下面io问题降下来,效率大幅度提高
if __name__ == '__main__':
for i in range(500): # 500 客户端同时 登录 服务端:这里1个线程 抗住了 500个client
t=Thread(target=client)
t.start()

并发编程 - 协程 - 1.协程概念/2.greenlet模块/3.gevent模块/4.gevent实现并发的套接字通信的更多相关文章

  1. python 并发编程 基于gevent模块 协程池 实现并发的套接字通信

    基于协程池 实现并发的套接字通信 客户端: from socket import * client = socket(AF_INET, SOCK_STREAM) client.connect(('12 ...

  2. Python之路(第三十一篇) 网络编程:简单的tcp套接字通信、粘包现象

    一.简单的tcp套接字通信 套接字通信的一般流程 服务端 server = socket() #创建服务器套接字 server.bind() #把地址绑定到套接字,网络地址加端口 server.lis ...

  3. 网络编程 - 1.简单的套接字通信/2.加上通信循环/3.bug修复/4.加上链接循环/5.模拟ssh远程执行命令

    1.简单的套接字通信 服务端 ''' 服务端 接电话 客户端 打电话 1.先启动服务端 2.服务端有两种套接字 1.phone 用来干接收链接的 2.conn 用来干收发消息的 ''' import ...

  4. Python 37 基于多线程实现套接字 、gevent 、单线程下实现并发的套接字通信

    一:基于多线程实现套接字 可添加多个客户端 from socket import * from threading import Thread def comunicate(conn): while ...

  5. python 之 网络编程(基于TCP协议的套接字通信操作)

    第八章网络编程 8.1 基于TCP协议的套接字通信 服务端套接字函数 s.bind() 绑定(主机,端口号)到套接字 s.listen() 开始TCP监听 s.accept() 被动接受TCP客户的连 ...

  6. python 并发编程 多线程 多线程实现并发的套接字通信

    进程内会生成一个主线程,让主线程执行server函数,server函数核心是accept(),让主线程干accept的工作, 建立连接,每建立一个连接应该执行通信函数 每建立一个连接就是生成一个子线程 ...

  7. python 并发编程 基于gevent模块实现并发的套接字通信

    之前线程池是通过操作系统切换线程,现在是程序自己控制,比操作系统切换效率要高 服务端 from gevent import monkey;monkey.patch_all() import geven ...

  8. python 并发编程 基于线程池实现并发的套接字通信

    不应该让服务端随着 并发的客户端数量增多,而无数起线程,应该用线程池,限制线程数量,控制最大并发数 io密集型程序,最大并发数是2 客户端 from socket import * client = ...

  9. (网络编程)基于tcp(粘包问题) udp协议的套接字通信

    import   socket 1.通信套接字(1人1句)服务端和1个客户端 2.通信循环(1人多句)服务端和1个客户端 3.通信循环(多人(串行)多句)多个客户端(服务端服务死:1个客户端---&g ...

随机推荐

  1. 0068 Git入门的第一节课

    这是 猴子都懂的Git入门 的学习笔记 Git安装与配置 下载安装Git:http://git-scm.com/ 从开始菜单启动Git Bash $ git --version git version ...

  2. Python 元祖的操作

    注意:元祖定义后不可修改,单个元祖后面必须加逗号,否则认为是字符串:tuple = ('apple',) 1.定义元祖 tuple = ('apple','banana','grape','orang ...

  3. rpc 理解

    RPC=Remote Produce Call 是一种技术的概念名词. HTTP是一种协议,RPC可以通过HTTP来实现,也可以通过Socket自己实现一套协议来实现. rpc是一种概念,http也是 ...

  4. Setup Factory 读取安装包的配置文件

    result = INIFile.GetValue(SessionVar.Expand("%SourceFolder%\\set.ini"), "set", & ...

  5. hadoop onekey_step2

    #onekey_step2 # Rrogram: # 安装hadoop简易集群程序 # 使用说明 # History: # -- luoqi v0. release # email: # @qq.co ...

  6. 亿级日PV的魅族云同步的核心协议与架构实践(转)

    云同步的业务场景 这是魅族云同步的演进,第一张是M8.M9,然后到后面的是MX系统,M9再往后发展,我们的界面可以看到基本上是没有什么变化的,但本质发生了很大的变化,我们经过了一些协议优化,发展到今天 ...

  7. C#string数组转换到int数组并得到最大最小值

    string[] input = { "1", "2", "3", "4", "5", " ...

  8. MySQL 5.6的72个新特性(译)

    一,安全提高 1.提供保存加密认证信息的方法,使用.mylogin.cnf文件.使用 mysql_config_editor可以创建此文件.这个文件可以进行连接数据库的访问授权. mysql_conf ...

  9. eclipse启动无响应,老是加载不了revert resources,或停留在Loading workbench状态

    做开发的同学们或多或少的都会遇到eclipse启动到一定程度时,就进入灰色无响应状态再也不动了.启动画面始终停留在Loading workbench状态.反复重启,状态依旧. 多数情况下,应该是非正常 ...

  10. Unity5.X 新版AssetBundle打包控制

    一.什么是AssetBundle 估计很多人只知道Unity的模型之类的东西可以导出成一种叫做AssetBundle的文件,然后打包后可以在Unity程序运行的时候再加载出来用.那么AssetBund ...