多线程 流 网络编程—重点

  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. Java 日志框架适配/冲突解决方案(值得收藏)
  2. oracle基础之工具系列(持续更新中,,)
  3. Linux Centos关机命令
  4. k8s 手动恢复redis 集群_高工面试之:redis的几种集群方式你都熟悉吗?
  5. 计算机机房管理具体工作和职责,机房管理
  6. 当稳定币遇上BCH,将会擦出什么样的火花?
  7. 自定义 Android 钟表盘,这一篇就够了
  8. docker 安装与部署
  9. IOS开发之Target-Action模式
  10. [面试备忘]数组(一维)最大子串总结
  11. ubuntu下iptables的用法
  12. Oracle 11g RAC添加一节点过程
  13. c语言 标准正态分布表,标准正态分布表ZP(Z).PDF
  14. QQ空间添加背景音乐
  15. Vue中金额、日期 格式化插件@formatjs/intl使用
  16. 广义相对论-学习记录6-第三章-张量分析与黎曼几何3
  17. 新年新气象,努力奋上新时代
  18. C++核心准则讨论:如果一个类是资源句柄,则它需要一个构造函数,一个析构函数以及复制和/或移动操作
  19. CSS imitate Microsoft Classic Menu
  20. 第55届高博会余温未减,中科易安联网智能门锁获全国高校青睐

热门文章

  1. SPIR-V 研究:编译器基本原理(一)
  2. win7计算机不支持此接口,Win7 "explorer.exe 不支持此接口"问题
  3. 关于最短剩余时间优先算法-进程调度模拟【C++】
  4. 维基百科六度分隔理论
  5. 跨期套利模型 2017-2019年白银跨期实盘年化7%-15%策略 策略开发
  6. 产品读书《谷歌和亚马逊如何做产品》
  7. 'rm' 不是内部或外部命令,也不是可运行的程序 或批处理文件。
  8. 谁动了你的 MSN?—— MSN 帐号被盗原因的分析和解决办法,鄙视msnlivesn.com
  9. SEO博客外链怎么做?现在的话是注重站内内容还是什么?
  10. 360wifi架设文件服务器,360wifi怎么搭建局域网共享平台