1. """ 协程 """
  2. '''
  3. 协程: 类似于一个可以暂停的函数,可以多次传入数据,可以多次返回数据
  4. 协程是可交互的
  5. 耗资源大小:进程 --> 线程(微进程) --> 协程(微线程)
  6. 协程完成通信:生产者与消费者模式--(进程/线程/协程间通信)都可实现
  7. 进程/线程/协程 三者之间的关系:
  8. 多进程是重开进程
  9. 多线程是在进程中开启
  10. 协程是在一个进程中的一个线程中开启
  11. 协程的执行单元就是函数,(从执行单元上属于并发,对于整个服务器来说并不是)
  12. 如果协程阻塞,那么整个进程(线程)也会被阻塞。任意时刻只有一个协程在执行
  13. 协程不能避开阻塞, 通过异步的方式避开阻塞
  14. '''
  15. from random import randint
  16. from time import sleep
  17.  
  18. def producer(generator):
  19. while True:
  20. task = randint(1, 100)
  21. generator.send(task)
  22. print('生产了一个任务:', task)
  23. sleep(2)
  24.  
  25. def consumer():
  26. while True:
  27. task = (yield)
  28. print('消费了一个任务:', task)
  29.  
  30. if __name__ == '__main__':
  31. generator = consumer()
  32. next(generator) # 启动生成器, 是consumer阻塞在yield, 才能执行producer中的send方法
  33. producer(generator)

greenlet:  原生的协程包  pip3 install greenlet

  价值一:高性能的原生协程

  价值二:语义更加明确的显示切换

  价值三:直接将函数包装成协程,保持代码风格

  1. ''' greenlet协程 '''
  2. from greenlet import greenlet
  3.  
  4. from random import randint
  5.  
  6. def producer():
  7. """ 生产者 """
  8. while True:
  9. item = randint(1, 100)
  10. c.switch(item) # 阻塞并 (转换发送数据)到consumer
  11. print('生产了一个任务:', item)
  12.  
  13. def consumer():
  14. """ 消费者 """
  15. while True:
  16. item = p.switch() # 阻塞并转换到producer
  17. print('消费了一个任务:', item)
  18.  
  19. if __name__ == '__main__':
  20. p = greenlet(producer)
  21. c = greenlet(consumer)
  22. c.switch() # 启动consumer
  23. '''
  24. switch转换工作单元(函数producer和consumer)
  25. '''

gevent:

  1. gevent = epoll(可避开阻塞) + greenlet(不可避开阻塞)
  1. 价值一:使用基于epolllibev来避开阻塞
    价值二:使用基于greenlet的高效协程来切换执行
    价值三:只有遇到阻塞的时候切换,没有轮询的开销,也没有线程的开销
  1. """ gevent = epoll(可避开阻塞) + greenlet(不可避开阻塞) """
  2. from gevent import monkey; monkey.patch_all() # 猴子补丁, 将socket替换成epoll封装的socket
  3. from gevent.queue import Queue # gevent封装的队列
  4. from random import randint
  5. from time import sleep
  6.  
  7. import socket
  8. import gevent
  9.  
  10. def producer():
  11. while True:
  12. item = randint(0, 100)
  13. queue.put(item)
  14. print('生产了一个任务:', item)
  15. sleep(1)
  16.  
  17. def consumer():
  18. while True:
  19. item = queue.get()
  20. print('消费了一个任务:', item)
  21. sleep(3)
  22.  
  23. def my_worker():
  24. while True:
  25. conn, addr = server.accept()
  26. recv_data = conn.recv(1024)
  27. if recv_data:
  28. conn.send(recv_data)
  29. else:
  30. conn.close()
  31. break
  32.  
  33. server = socket.socket()
  34. server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
  35. server.bind(('', 8000))
  36. server.listen(1000)
  37.  
  38. queue = Queue(3)
  39.  
  40. p = gevent.spawn(producer) # 协程化
  41. c = gevent.spawn(consumer)
  42. # 等待所有协程结束
  43. gevent.joinall(
  44. [p, c]
  45. )

协程,greenlet,gevent的更多相关文章

  1. python 协程 greenlet gevent

    一.并发的本质 切换+保存状态 cpu正在运行一个任务,会在两种情况下切走去执行其他的任务(切换由操作系统强制控制),一种情况是该任务发生了阻塞,另外一种情况是该任务计算的时间过长时间片到了 二.协程 ...

  2. 线程队列 concurrent 协程 greenlet gevent

    死锁问题 所谓死锁:是指两个或两个以上的进程或线程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去.此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进 ...

  3. day 34 线程队列 线程池 协程 Greenlet \Gevent 模块

    1 线程的其他方法 threading.current_thread().getName()    查询当前线程对象的名字 threading.current_thread().ident      ...

  4. 协程,greenlet原生协程库, gevent库

    协程简介 协程(coroutine),又称为微线程,纤程,是一种用户级的轻量级线程.协程拥有自己的寄存器上下文和栈. 协程调度切换时,将寄存器上下文和栈保存到其他地方,在切回来时,恢复之前保存的上下文 ...

  5. 【python】-- 协程介绍及基本示例、协程遇到IO操作自动切换、协程(gevent)并发爬网页

    协程介绍及基本示例 协程,又称微线程,纤程.英文名Coroutine.一句话说明什么是协程:协程是一种用户态的轻量级线程. 协程拥有自己的寄存器上下文和栈.协程调度切换时,将寄存器上下文和栈保存到其他 ...

  6. 并发编程(六)——进程/线程池、协程、gevent第三方库

    进程/线程池.协程.gevent第三方库 一.进程/线程池 1.进程池 (1)什么是进程池 如果需要创建的子进程数量不大,可以直接利用multiprocess中的Process来创建.但是当需要创建上 ...

  7. python 线程(其他方法,队列,线程池,协程 greenlet模块 gevent模块)

    1.线程的其他方法 from threading import Thread,current_thread import time import threading def f1(n): time.s ...

  8. 协程greenlet、gevent

    greenlet为了更好使用协程来完成多任务,python中greenlet模块对其封装,从而使得切换任务变得更加简单安装方式 pip3 install greenlet 示例代码: from gre ...

  9. 协程----greenlet模块,gevent模块

    1.协程初识,greenlet模块 2.gevent模块(需要pip安装) 一.协程初识,greenlet模块: 协程:是单线程下的并发,又称微线程,纤程.英文名Coroutine.一句话说明什么是线 ...

  10. 14 并发编程-(协程)-greenlet模块&gevent模块

    1.实现多个任务之间进行切换,yield.greenlet都没有实现检测I/O,greenlet在实现多任务切换下更简单 from greenlet import greenlet def eat(n ...

随机推荐

  1. icon moon追加字体

    一.初始自定义字体为icon moon1@font-face { font-family: 'icomoon1'; src: url('fonts/icomoon1.eot?9fhn24'); src ...

  2. E: Sub-process /usr/bin/dpkg returned an error code (1)错误解决

    在用apt-get安装软件时出现了类似于install-info: No dir file specified; try --help for more information.dpkg:处理 get ...

  3. C# 引用类型公共变量的影响

    public int[] a =new int[2]; private void button1_Click(object sender, EventArgs e) { bing(a); } priv ...

  4. 剑指Offer 14. 链表中倒数第k个结点 (链表)

    题目描述 输入一个链表,输出该链表中倒数第k个结点. 题目地址 https://www.nowcoder.com/practice/529d3ae5a407492994ad2a246518148a?t ...

  5. Windows10 64位安装TensorFlow-GPU

    TensorFlow有GPU版和CPU版. GPU版需要CUDA和cuDNN支持,到链接:https://developer.nvidia.com/cuda-gpus 确认自己的显卡是否支持CUDA. ...

  6. ssh: connect to host gitlab.alpha.com port 22: Network is unreachable

    在这里只说明我遇到的问题和解决方法,可能并不能解决你遇到的问题: git clone git@gitlab.alpha.com:ipcam/ambarella.gitCloning into 'amb ...

  7. 类Shiro权限校验框架的设计和实现

    前言: 之前简单集成了springmvc和shiro用于后台管理平台的权限控制, 设计思路非常的优美, 而且编程确实非常的方便和简洁. 唯一的不足, 我觉得配置稍有些繁琐. 当时我有个小想法, 觉得可 ...

  8. MacBook使用笔记2 - 安装windows虚拟机攻略

    转载请标注原链接:http://www.cnblogs.com/xczyd/p/5498878.html 5月初从阿里滚粗,然后失去了公司发的Mac Air.说实话Mac机器确实比windows好用一 ...

  9. 微信小程序传值以及获取值方法

    http://www.51xuediannao.com/xiaochengxu/xiaochengxu-chuanzhi.html

  10. day05 集合

    今日进度(数据类型) 集合 内存相关 深浅拷贝 1.集合表示 1.无序 2.不重复 3.hash查找 #问题:v={}表示? set: v1=set()#空集合 v1={1,2,3,4,5} dict ...