协程的好处:

在IO密集型的程序中由于IO操作远远慢于CPU的操作,所以往往需要CPU去等IO操作。 同步IO下系统需要切换线程,让操作系统可以在IO过程中执行其他的东西。 这样虽然代码是符合人类的思维习惯但是由于大量的线程切换带来了大量的性能的浪费,尤其是IO密集型的程序。

所以人们发明了异步IO。就是当数据到达的时候触发我的回调。来减少线程切换带来性能损失。 但是这样的坏处也是很大的,主要的坏处就是操作被 “分片” 了,代码写的不是 “一气呵成” 这种。 而是每次来段数据就要判断 数据够不够处理哇,够处理就处理吧,不够处理就在等等吧。这样代码的可读性很低,其实也不符合人类的习惯。

但是协程可以很好解决这个问题。比如 把一个IO操作 写成一个协程。当触发IO操作的时候就自动让出CPU给其他协程。要知道协程的切换很轻的。 协程通过这种对异步IO的封装 既保留了性能也保证了代码的容易编写和可读性。在高IO密集型的程序下很好。但是高CPU密集型的程序下没啥好处。

协成的简单实现greenlet:

关于greenlet实现代码:

调用时使用switch()

from greenlet import greenlet
import time
def test1():while True:print('沉大器者得天下')gr2.switch()time.sleep(0.5)
def test2():while True:print('不拘小节')time.sleep(0.5)gr1=greenlet(test1)
gr2=greenlet(test2)gr1.switch()

View Code

gevent切换执行

  • gevent导入
  • 设置协程要执行的函数(任务)
  • gevent.spawn(协程要执行的函数,参数)实例化协程对象
  • g1.join()来阻塞主线程运转,直到协程运转完毕

gevent 协程的切换时根据是否有阻塞进行,而且这个阻塞需要gevent能够识别,如果是系统的,你需要加上monkey.patch_all()(gevent.sleep(1)  ----->>  如果是系统的time.sleep(1))

在此给出一个基础的演示代码:

import gevent
from gevent import monkey
import timedef test1():list=['不要','小看','自己','也不要','大看','别人','放大心灵死角']n=len(list)while n>0:for i in list:print(i)gevent.sleep(1)n-=1def test2():list=['人生','三件','大事','大事','中事','小事','你会溃烂在别人得眼眶里']n=len(list)while n>0:for i in list:print(i)gevent.sleep(1)n-=1g1=gevent.spawn(test1)
g2=gevent.spawn(test2)g1.join()
g2.join()

View Code

一个实例代码多线程服务端:

import gevent
from gevent import socket, monkey
import os# 接收信息,并回复信息
def co(conn,IP):try:while True:# 接收信息并解码data = conn.recv(1024).decode('gbk')if data:print('收到%s:%s 信息:%s 进程:%s' % (IP[0], IP[1],data, os.getpid()))# # 给客户端回复数据# conn.send(b'thanks')else:conn.close()breakfinally:conn.close()# 创建协程,并获取连接到的客户端信息,传输调用函数
def server(port):# 创建协程xc = socket.socket()# 绑定本地地址addr = ('', port)xc.bind(addr)# 监听是否有客服端连接xc.listen(5)try:while True:#获取客户端连接的信息,并进行处理print('等待连接。。。')connent, ad = xc.accept()print('连接成功')# 调起一个协程,调用函数,对数据进行回复操作gevent.spawn(co, connent, ad)'''
            运用协程,主要是想实现能同时和多个客户端进行信息交互因此,在这里不能调用join()方法(停止等待所有线程工作完后再继续)要不然就无法实现多边交互的功能了,'''
            # g = gevent.spawn(co, connent,ad)# g.join()finally:xc.close()if __name__=='__main__':server(6969)# print('系统出现错误')

连接服务端的客户端:

from socket import *
import timeqqSocket=socket(AF_INET,SOCK_STREAM)Addr=('192.168.8.195',6969)
# qqSocket.bind(Addr)qqSocket.connect(Addr)
n=10000
while True:time.sleep(1)sendData='八戒 你瘦了 'qqSocket.send(sendData.encode('gbk'))if not sendData:breakn-=1### recData=qqSocket.recv(1024)# print('收到服务端的回复:%s'%recData.decode('gbk'))qqSocket.close()

转载于:https://www.cnblogs.com/Dark-fire-liehuo/p/9775561.html

协程实现多边同时交互原理相关推荐

  1. golang异步协程调度原理

    golang异步协程调度 在1.14的go版本中,官方通过加入信号来进行协程的调度,后续就都支持了这种异步协程抢占,避免了早起的考栈调度时来检查是否执行超时的逻辑.本文简单来对比这种实现的原理. 调度 ...

  2. Unity协程(Coroutine)原理深入剖析再续

    Unity协程(Coroutine)原理深入剖析再续 By D.S.Qiu 尊重他人的劳动,支持原创,转载请注明出处:http.dsqiu.iteye.com 前面已经介绍过对协程(Coroutine ...

  3. python多线程调度_python并发编程之进程、线程、协程的调度原理(六)

    进程.线程和协程的调度和运行原理总结. 系列文章 进程.线程的调度策略介绍 linux中的进程主要有三种调度策略: 优先级调度:将进程分为普通进程和实时进程: 先进先出(队列)调度:实时进程先创建的先 ...

  4. 协程的原理和应用,C++现实协程

    协程的原理 协程(coroutine)跟具有操作系统概念的线程不一样,实际上协程就是类函数一样的程序组件,你可以在一个线程里面轻松创建数十万个协程,就像数十万次函数调用一样.只不过函数只有一个调用入口 ...

  5. Kotlin协程:挂起与恢复原理逆向刨析

    前言:只有在那崎岖的小路上不畏艰险奋勇攀登的人,才有希望达到光辉的顶点. --马克思 前言 经过前面两篇协程的学习,我相信大家对协程的使用已经非常熟悉了.本着知其然更要知其之所以然的心态,很想知道它里 ...

  6. 小议Python3的原生协程机制

    此文已由作者张耕源授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 在最近发布的 Python 3.5 版本中,官方正式引入了 async/await关键字.在 asyncio ...

  7. 最轻量级的C协程库:Protothreads

    原文地址:https://www.linuxidc.com/Linux/2012-07/66395p2.htm 协程的好处不用再多说,作为与函数调用/返回相对的概念,它使我们思考问题的方式经历一场变革 ...

  8. python 协程、进程、线程_Python 中的进程、线程、协程

    1. 进程 进程是正在运行的程序实例,是内核分配资源的最基本的单元.进程拥有自己独立的堆和栈,独立的地址空间,资源句柄.进程由 OS 调度,调度开销较大,在并发的切换过程效率较低. Python 提供 ...

  9. python中的协程:greenlet和gevent

    协程是一中多任务实现方式,它不需要多个进程或线程就可以实现多任务. 1.通过yield实现协程: 代码: import time def A():while 1:print('------A----- ...

最新文章

  1. 微生物入侵:过程、模式与机制
  2. 个推数据统计产品(个数)iOS集成实践
  3. C++继承与派生(原理归纳)
  4. 【LDA学习系列】Dirichlet分布python代码
  5. Hadoop安装与配置问题说明
  6. SpringBoot一个依赖搞定Session共享,没有比这更简单的方案了!
  7. [Qt教程] 第28篇 XML(二)使用DOM创建和操作XML文档
  8. 去哪里学习python_Python从哪里开始学?怎么入门?
  9. luogu4267 TamingtheHerd (dp)
  10. 2018年“百家姓”出炉,新生儿爆款名字是这些......
  11. 61 SD配置-科目分配-分配税收确定的交货工厂
  12. wordspress-作品展示主题Muiteer2.3.7开心版主题模板
  13. C++学习笔记(1)-文件写入
  14. Java跨语言调用实现方案
  15. atitit.软件开发概念--过滤和投影 数据操作
  16. linux命令行改变时区,Linux命令行操作修改系统时区
  17. python怎么把代码做成软件_python代码能做成软件吗
  18. 整车EMC正向开发及仿真
  19. xp系统计算机怎么设置权限设置,xp系统共享权限如何设置|xp系统共享权限设置方法...
  20. Unreal Engine 4 —— Smear Frame效果的实现与分析

热门文章

  1. python提供了两种基本的数值类型_python数据分析(一) python当中的数据类型--数字和常用函数...
  2. pycharm缩进对齐线_代码中的缩进线
  3. python类与方法与函数_Python 中的函数与类的方法
  4. laytpl语法_浅谈laytpl 模板空值显示null的解决方法及简单的js表达式
  5. 批量查进程linux,linux 批量删除进程与查看进程详解
  6. 云计算具有什么平台_工业云平台具有哪些功能?
  7. 时间插件只能选择整点和半点_外贸人如何把控合适的客户开发时间及跟进频率...
  8. python method_用实例分析Python中method的参数传递过程
  9. linux安装steam
  10. windows10重装后锁定其他盘_电脑重装Windows10系统步骤