#斐波那契
def fid(n):
res = []
indx = 0
a = 0
b = 1
while indx < n :
res.append(b)
a,b = b,a+b
indx += 1
return res print(fid(1000))

  

#  生成器
def fid(n):
indx = 0
a = 0
b = 1
while indx < n :
yield b # 暂停并返回 跳出函数
res.append(b)
a,b = b,a+b
indx += 1 f = fid(10)
print(f)
print(next(f))

  

#  生成器
import time def fid(n):
indx = 0
a = 0
b = 1
while indx < n :
data = yield b # 暂停并返回 跳出函数
time.sleep(data)
a,b = b,a+b
indx += 1 f = fid(10)
# # 使用 send 前,要 next 下
# f.__next__()
# 或者 先 send ( None )
f.send(None)
print(f.send(2))
print(f.send(2))
print(f.send(2))

  

#  协程 :非抢占式多任务子程序组件

import greenlet     #  pip install greenlet

from greenlet import greenlet

def tast_1():
print(11111)
gr2.switch()
print(22222) def tast_2():
print(33333)
print(44444)
gr1.switch() gr1 = greenlet(tast_1)
gr2 = greenlet(tast_2)
gr1.switch() # 调用协程, ######

11111
33333
44444
22222

  

#  协程   传参

import greenlet     #  pip install greenlet

from greenlet import greenlet

def tast_1():
print(11111)
a = gr2.switch() # 传参
print(22222)
print(a) def tast_2():
print(33333)
print(44444)
gr1.switch(123) # 传参 gr1 = greenlet(tast_1)
gr2 = greenlet(tast_2)
gr1.switch() # 调用协程, #########
11111
33333
44444
22222
123

  

遇到阻塞时自动切换,

#  gevent HTTP 请求

from gevent import monkey;monkey.patch_all()       #  猴子补丁
import gevent
'''当 greenlet 遇到一个 IO 操作垢时候 ,自动切换到其他的 greenlet'''
import requests
# import time def get_res(pn):
print('开始',pn)
requests.get('https://www.baidu.com') # 这里耗时发生阻塞
# time.sleep(3)
print('结束',pn) # gevent.spawn 启动协程
ta = [gevent.spawn(get_res,i) for i in range(5)]
# time.sleep(2)
gevent.joinall(ta)
# gevent.joinall(ta,timeout=1) # spawn 创建一个 gevent 的的协程对象,开始运行,
# 为什么 ta = [gevent.spawn(get_res,i) for i in range(5)]
# 不打印,?因为他运行为立马退出,不会打印,
# joinall 等待所有 greenlet 执行完毕,

  

如果没有使用猴子补丁

#  生产者与消费者

import gevent
import random
from queue import Queue # 队列
q = Queue(2) def con(): # 消费者
while True:
print(q.qsize())
iten = q.get()
print('删除一个数据{}'.format(iten)) def pro(): # 生产者
while True:
print(q.qsize())
iten = random.randint(0,99) # 如果没有猴子补丁,程序将阻塞在这里,
q.put(iten) print('添加一个数据{}'.format(iten)) p1 = gevent.spawn(pro)
c1 = gevent.spawn(con)
gevent.joinall([p1,c1])

  ########

0
添加一个数据32
1
添加一个数据22
2

在  gevent 有 queue 队列,也可实现相互切换

在上边代码中引入

from gevent.queue import Queue

引入猴子补丁

from gevent import monkey;monkey.patch_all()#  猴子补丁
#  生产者与消费者

import gevent
from gevent import monkey;monkey.patch_all() # 猴子补丁
import random
from queue import Queue # 队列
q = Queue(2) def con(): # 消费者
while True:
print(q.qsize())
iten = q.get()
print('删除一个数据{}'.format(iten)) def pro(): # 生产者
while True:
print(q.qsize())
iten = random.randint(0,99)
q.put(iten)
print('添加一个数据{}'.format(iten)) p1 = gevent.spawn(pro)
c1 = gevent.spawn(con)
gevent.joinall([p1,c1])

  

0
添加一个数据57
1
添加一个数据25
2
2
删除一个数据57
1
删除一个数据25
0

协程,猴子补丁,实现并发服务器

from gevent import monkey;monkey.patch_all()
import socket
import gevent sever = socket.socket()
sever.bind(('',10000))
sever.listen(5)
print('服务器开启') def func(conn):
while True:
data = conn.recv(1024)
if data:
print(data)
else:break while True:
conn,addr = sever.accept()
print(addr)
gevent.spawn(func,conn)

  

潭州课堂25班:Ph201805201 并发(协程) 第十五课 (课堂笔记)的更多相关文章

  1. 潭州课堂25班:Ph201805201 并发(通信) 第十三课 (课堂笔记)

    from multiprocessing import Process # 有个 url 列表 ,有5个 url ,一次请求是1秒,5个5秒 # 要求1秒把 url 请求完, a = [] # 在进程 ...

  2. 潭州课堂25班:Ph201805201 django 项目 第四十五课 mysql集群和负载均衡(课堂笔记)

    2.使用docker安装Haproxy 一.为什么要使用数据库集群和负载均衡? 1.高可用 2.高并发 3.高性能 二.mysql数据库集群方式 三.使用docker安装PXC 1.拉取PXC镜像 d ...

  3. 潭州课堂25班:Ph201805201 django 项目 第三十五课 后台用户权限的添加 mixins 课堂笔记)

    验证用户登录: 对一个视图函数进行登录权限验证,(登录后才可以访问,否则重定向到登录页面) #from django.contrib.auth.decorators import login_requ ...

  4. 潭州课堂25班:Ph201805201 WEB 之 页面编写 第四课 登录注册 (课堂笔记)

    index.html 首页 <!DOCTYPE html> <html lang="en"> <head> <meta charset=& ...

  5. 潭州课堂25班:Ph201805201 WEB 之 页面编写 第三课 (课堂笔记)

    index.html <!DOCTYPE html> <html lang="en"> <head> <meta charset=&quo ...

  6. 潭州课堂25班:Ph201805201 WEB 之 页面编写 第二课 (课堂笔记)

    index.html <!DOCTYPE html> <html lang="en"> <head> <meta charset=&quo ...

  7. 潭州课堂25班:Ph201805201 WEB 之 页面编写 第一课 (课堂笔记)

    index.html <!DOCTYPE html> <html lang="en"> <head> <meta charset=&quo ...

  8. 潭州课堂25班:Ph201805201 第十课 类的定义,属性和方法 (课堂笔记)

    类的定义 共同属性,特征,方法者,可分为一类,并以名命之 class Abc: # class 定义类, 后面接类名 ( 规则 首字母大写 ) cls_name = '这个类的名字是Abc' # 在类 ...

  9. python 并发协程

    一 引子 本节的主题是基于单线程来实现并发,即只用一个主线程(很明显可利用的cpu只有一个)情况下实现并发,为此我们需要先回顾下并发的本质:切换+保存状态 cpu正在运行一个任务,会在两种情况下切走去 ...

随机推荐

  1. OA协同办公软件

    OA协同办公软件: 泛微软件. 九思软件. 华天动力. 万户OA.:北京万户网络技术有限公司创立于1998年2月,是北京华宇软件股份有限公司(股票简称:“华宇软件”,股票代码:300271)的全资子公 ...

  2. centos6.5环境自动化运维之puppet实现nginx反向代理功能及puppet安装配置详解

    puppet是一种Linux.Unix.windows平台的集中配置管理系统,使用自有的puppet描述语言,可管理配置文件.用户.cron任务.软件包.系统服务等.puppet把这些系统实体称之为资 ...

  3. discuz3.4:在Centos6.5中安装过程

    参考文章:https://www.cnblogs.com/hehongbin/articles/5741270.html https://www.cnblogs.com/mitang/p/552454 ...

  4. 轻松读懂MSIL

    原文:http://www.cnblogs.com/brookshi/p/5225801.html

  5. gulp自动化构建教程

    gulp及gulpfile.js编写示例    本文主要记录一个gulpfile.js示例,以免以后用的时候遗忘.但首先还是要了解gulp是什么以及如何使用. 一.什么是gulp 简单来说:就是压缩前 ...

  6. C#中Convert.ToInt32、int.TryParse、(int)和int.Parse四者的区别

    Convert.ToInt32.(int)和int.Parse三者的区别: 首先:Convert.ToInt32 适合将object类类型转换成int类型,如Convert.ToInt32(sessi ...

  7. OCM_第十六天课程:Section7 —》GI 及 ASM 安装配置 _安装 GRID 软件/创建和管理 ASM 磁盘组/创建和管理 ASM 实例

    注:本文为原著(其内容来自 腾科教育培训课堂).阅读本文注意事项如下: 1:所有文章的转载请标注本文出处. 2:本文非本人不得用于商业用途.违者将承当相应法律责任. 3:该系列文章目录列表: 一:&l ...

  8. java 动态代理(类型信息)

    代理是基本的设计模式之一它为你提供额外的或不同的操作,而插入的用来代替"实际"对象的对象. package typeinfo; //: typeinfo/SimpleProxyDe ...

  9. PHP获取文件后缀名

    PHP获取文件后缀名是PHP学习者常见的一种操作,无论是在面试过程中还是PHP新手自学中.PHP获取文件后缀名都是很普遍的需要掌握的一个知识点. 下面我们就给大家总结介绍PHP获取文件扩展名也就是后缀 ...

  10. bzoj3224 splay板子

    开始学习新知识:splay——tree 是个板子题,学习splay可以看博客 https://blog.csdn.net/Clove_unique/article/details/50630280 # ...