多线程 流 网络编程—重点

  1. 协成概念------寄存器 优缺点 概念 背----重点
协成(微线程,纤程)---(Coroutine)线程---操作系统调度协成----程序根据需要调度概念:线程是系统级别的它们由操作系统调度,而协程则是程序级别的由程序根据需要自己调度。在一个线程中会有很多函数,我们把这些函数称为子程序,在子程序执行过程中可以中断去执行别的子程序,而别的子程序也可以中断回来继续执行之前的子程序,这个过程就称为协程。也就是说在同一线程内一段代码在执行过程中会中断然后跳转执行别的代码,接着在之前中断的地方继续开始执行,类似于yield操作寄存器:协程拥有自己的‘寄存器上下文和栈’。协程调度切换时,将寄存器上下文和栈保存到其他地方,在切回来的时候,恢复先前保存的寄存器上下文和栈。因此:协程能保留上一次调用时的状态(即所有局部状态的一个特定组合),每次过程重入时,就相当于进入上一次调用的状态,换种说法:进入上一次离开时所处逻辑流的位置。优缺点:协程的优点:(1)无需线程上下文切换的开销,协程避免了无意义的调度,由此可以提高性能(但也因此,程序员必须自己承担调度的责任,同时,协程也失去了标准线程使用多CPU的能力)(2)无需原子操作锁定及同步的开销-----互斥锁(3)方便切换控制流,简化编程模型(4)高并发+高扩展性+低成本:一个CPU支持上万的协程都不是问题。所以很适合用于高并发处理。协程的缺点:(1)无法利用多核资源:协程的本质是个单线程,它不能同时将 单个CPU 的多个核用上,协程需要和进程配合才能运行在多CPU上.当然我们日常所编写的绝大部分应用都没有这个必要,除非是cpu密集型应用。(2)进行阻塞(Blocking)操作(如IO时)会阻塞掉整个程序
#1.----举例
def a():for i in range(100):print(i)
def b():for i in range(100):print(i)def work():a()b()
  1. 协成实现方式(3)—yield greenlet gevent
#--------yield方法
def a():print("进入a方法")bone = yieldprint(bone)print("结束a方法")
def b(aa):aa.send(None)print("进入b方法")aa.send("一个包子")
def work():aa = a()b(aa)
work()

运行结果

2.-------greenlet方法----程序间切换执行
import greenlet
def A():print('a------')g2.switch()print('a------2')g2.switch()
def B():print('b------')g1.switch()g3.switch()print('b------2')
def C():print('c------')g2.switch()
g1 = greenlet.greenlet(A)
g2 = greenlet.greenlet(B)
g3 = greenlet.greenlet(C)
g1.switch()

运行结果

#3 gevent
import gevent
from gevent.event import Event
evt = Event()
def setter():print('A: 我是setter方法')gevent.sleep(3)print('B:休眠3秒结束')evt.set()
def waiter():print("等待ing。。。。。")evt.wait()print("等待结束。。。。")
def main():gevent.joinall([gevent.spawn(setter),gevent.spawn(waiter),gevent.spawn(waiter),])
if __name__ == '__main__':main()

运行结果

#AsyncResult----异步
import gevent
from gevent.event import AsyncResult
a = AsyncResult()
def setter():gevent.sleep(3)a.set('Hello~')
def waiter():print("你好")print(a.get())
gevent.joinall([gevent.spawn(setter),gevent.spawn(waiter),
])

运行结果

# gevent 队列  put_nowait   get_nowait
import gevent
from gevent.queue import Queuetasks = Queue()def worker(name):while not tasks.empty():task = tasks.get()print(name,task)gevent.sleep(0)  #阻塞但不花费时间print('终止!!!!!!')def boss():for i in range(1,25):tasks.put_nowait(i)gevent.spawn(boss).join()gevent.joinall([gevent.spawn(worker,'1l'),gevent.spawn(worker,'2l'),gevent.spawn(worker,'3l')
])

运行结果

#Group/Pool   组合池---------在一个组(group)里面的greenlet会被统一管理和调度
#等待所有spawn完成,每完成一个就会从group里面去掉。没有返回值
'''
import gevent
from gevent.pool import Groupdef talk(msg):for i in range(3):print(msg)g1 = gevent.spawn(talk,'bar')
g2 = gevent.spawn(talk,'foo')group = Group()
group.add(g1)
group.add(g2)
group.join()
print("主线程")

运行结果

#Group().map()
#group.map()这个函数来取得各spawn的返回值。
#map()是由第二个参数控制迭代次数,并且传递给第一个参数值而运行的。
from gevent import getcurrent
from gevent.pool import Groupgroup = Group()
def hello_from(n):print('size of group %s' % len(group))print('h f g %s'%id(getcurrent))return n
x = group.map(hello_from,range(3))
print (type(x))
print(x)

运行结果

#Group().imap()-----返回迭代器对象
import gevent
from gevent.pool import Groupdef intensive(n):gevent.sleep(3-n)return 'task',nprint('Ordered')
ogroup = Group()x = ogroup.imap(intensive,range(3))
print(x)for x in ogroup.imap(intensive,range(3)):print(x)

运行结果

#Group().imap_unordered
#先返回的先回来,这个如果是imap运行的话,会先等上3秒钟开始返回0然后1 2 一次返回。
import gevent
from gevent.pool import Groupdef intensive(n):gevent.sleep(3-n)return 'task',n
igroup = Group()
for i in igroup.imap_unordered(intensive,range(3)):print(i)

运行结果

#group
#Group是Pool类的父类。
# pool是可以指定池子里面最多可以拥有多少greenlet在跑而且申明也很简单:
#from gevent.pool import Pool
#add 里 套 add
  1. 3.事件驱动
事件是一个可以让我们在Greenlet之间异步通信的形式事件驱动编程是一种编程范式,这里程序的执行流由外部事件来决定服务器处理模型的程序时,有以下几种模型:(1)每收到一个请求,创建一个新的进程,来处理该请求;(2)每收到一个请求,创建一个新的线程,来处理该请求;(3)每收到一个请求,放入一个事件列表,让主进程通过非阻塞I/O方式来处理请求第(1)中方法,由于创建新的进程的开销比较大,所以,会导致服务器性能比较差,但实现比较简单。第(2)种方式,由于要涉及到线程的同步,有可能会面临死锁等问题。第(3)种方式,在写应用程序代码时,逻辑比前面两种都复杂。综合考虑各方面因素,一般普遍认为第(3)种方式是大多数网络服务器采用的方式4.I/O多路复用

协成 协成驱动方式 事件驱动相关推荐

  1. 在树莓派(Linux)上使用FTDI的usb转串口芯片ft232两种驱动方式(VCP和D2xx)

    FTDI的芯片ft232芯片提供VCP和D2xx两种方式的驱动.目前的树莓派系统中提供的主要还是VCP的驱动方式.但是有的代码是基于D2xx的驱动方式的API编写的,这时候就需要将系统中的VCP驱动方 ...

  2. Go中协程间通信的方式Sync.Cond

    在Go中协程间通信的方式有多种,最常用的是channel.如果牵扯多个协程的通知,可以使用sync.Cond. 1. 程序中的通信方式 GO语言中有句名言:"不要用共享内存来通信,而是使用通 ...

  3. Unity 之 关于停止协程的五种方式解析

    Unity 之 关于停止协程的五种方式解析 前言:了解协程 方式一:函数的方式 方式二:函数名的方式 方式三:接收返回值 方式四:StopAllCoroutines 方式五:禁用/销毁游戏对象 本文小 ...

  4. 【开源电机驱动】符号-幅值驱动方式

    原文地址:http://www.modularcircuits.com/blog/articles/h-bridge-secrets/sign-magnitude-drive/ 本文为翻译校正稿件,含 ...

  5. 步进电机基本原理及驱动方式详解

    步进电机基本原理及驱动方式详解 步进电机相关概念 基本原理 类型和结构 转子结构 定子结构 励磁方式 ATD9800 驱动使用实例 参考文献 步进电机相关概念 步进电机是一种常用于控制和定位应用的电动 ...

  6. 浅析步进电机常见的三种驱动方式

    步进电机是一种作为控制用的特种电机, 它的旋转是以固定的角度(称为"步距角")一步一步运行的, 其特点是没有积累误差(  为100%), 所以广泛应用于各种开环控制. 步进电机的运 ...

  7. 6脚数码管驱动方式(7脚类似)

    最近遇到一个6脚数码管的案子,跟常规的共阴/共阳数码管驱动方式完全不同,处理方法有点特殊,特此记录.先上传数码管的脚位资料.(做的是一个蓝牙对耳充电仓方案,百分比显示充电仓本身的电量,下面显示对耳的左 ...

  8. 无刷直流电机的结构及驱动方式

    1.铁心构成励磁线圈产生的磁通的磁路.它采用的是高磁导率的硅钢板叠层而成,可以抑制涡流降低铁损. 电机的转矩与磁场的磁通密度成比例.另外,磁通密度与驱动线圈的安匝数,也就是与驱动电流X匝数成比例. 为 ...

  9. 虚拟数字人的3种驱动方式

    虚拟数字人是由计算机程序所构建的具有人类特征的虚拟实体,目前的虚拟数字人经过了三代的更迭,划分每一代更迭的标准则是虚拟数字人的驱动方式. 一.虚拟数字人1.0:动画&CG驱动 虚拟数字人1.0 ...

  10. 【蓝桥杯单片机】超声波模块(测距原理,驱动方式)

    实验开发板为CT107D蓝桥官方板,编译环境为MDK5 超声波探头测距原理: 发射头发射超声波,遇到障碍物后返回,接收探头接受到返回信号. 两个动作产生的时间差可以是我们根据声音在空气中传播的速度来( ...

最新文章

  1. mysql 系统表 存储过程_数据库系统(六)---MySQL语句及存储过程
  2. TSPL学习笔记(1)
  3. 轻量级网络主干综述 20种
  4. 专家周 | 电商牛人的新玩法,寺库如何做奢侈品电商?视频社交电商如何运作的?...
  5. Unable to open socket file: target process not responding or HotSpot VM not loaded The -F option can
  6. .call() 与 .apply() 的用法及区别
  7. BZOJ1095: [ZJOI2007]Hide 捉迷藏(动态点分治)
  8. HDU1262 寻找素数对【素数】
  9. WPF MVVM 架构 Step By Step(4)(添加bindings - 完全去掉后台代码)
  10. 【数据结构C++】哈希表(三)
  11. AM3352时钟系统分析
  12. RAID 技术全解 – RAID0、RAID1、RAID5、RAID10
  13. oracle+sql+groupby,oracle学习笔记2:SQL执行
  14. 全国大学生网络安全精英赛初赛(nisp一级)
  15. DeepLabv2 caffe创建可编译环境
  16. HTML中的format函数是干嘛的,css format是什么意思?
  17. MSP430停车位感应装置设计(能记录停车时间)
  18. 模板笔记007 - 模板的声明、形参、实参
  19. 盲源分离技术 matlab,基于ICA盲源分离的研究及matlab实现(毕业学术论文设计).doc...
  20. 【项目管理】-任务拆分

热门文章

  1. 解决ubuntu16.04插耳机没有声音的问题
  2. 网站安全防护措施有哪些
  3. C++ HOOK PC微信实现无限制多开,理论支持所有版本,本文使用微信 3.0.0.47
  4. 无线桥接dhcp服务器不启动,TP-Link路由器桥接提示“获取IP地址失败,请检查DHCP是否开启...
  5. PowerPoint 在播放时自动运行宏
  6. The name `AssetDatabase' does not exist in the current context
  7. 笔记本wife功能丢失,网络适配器代码56错误
  8. 201771010112罗松《面向对象程序设计(java)》第十六周学习总结
  9. 踏歌黑名单工具类DEMO(AUB)
  10. 介绍一款通过软件设置调节显示器亮度的工具:护眼宝