python协程1:协程 10分钟入门

最近找到一本python好书《流畅的python》,是到现在为止看到的对python高级特性讲述最详细的一本。 看了协程一章,做个读书笔记,加深印象。 协程定义 协程的底层架构是在pep342 中定义,并在python2.5 实现的。 HUGOMORE42 python2.5 中,yield关键字可以在表达式中使用,而且生成器API中增加了 .send(value)方法。生成器可以使用.send(…)方法发送数据,发送的数据会成为生成器函数中yield表达式的值。 协程是指一个过程,这个过程与调用方协作,产出有调用方提供的值。因此,生成器可以作为协程使用。 除了 .send(…)方法,pep342 和添加了 .throw(…)(让调用方抛出异常,在生成器中处理)和.close()(终止生成器)方法。 python3.3后,pep380对生成器函数做了两处改动: 生成器可以返回一个值;以前,如果生成器中给return语句提供值,会抛出SyntaxError异常。 引入yield from 语法,使用它可以把复杂的生成器重构成小型的嵌套生成器,省去之前把生成器的工作委托给子生成器所需的大量模板代码。 协程生成器的基本行为 首先说明一下,协程有四个状态,可以使用inspect.getgeneratorstate(…)函数确定: GEN_CREATED # 等待开始执行 GEN_RUNNING # 解释器正在执行(只有在多线程应用中才能看到这个状态) GEN_SUSPENDED # 在yield表达式处暂停 GEN_CLOSED # 执行结束 #! -*- coding: utf-8 -*- import inspect # 协程使用生成器函数定义:定义体中有yield关键字。 def simple_coroutine(): print('-> coroutine started') # yield 在表达式中使用;如果协程只需要从客户那里接收数据,yield关键字右边不需要加表达式(yield默认返回None) x = yield print('-> coroutine received:', x) my_coro = simple_coroutine() my_coro # 和创建生成器的方式一样,调用函数得到生成器对象。 # 协程处于 GEN_CREATED (等待开始状态) print(inspect.getgeneratorstate(my_coro)) my_coro.send(None) # 首先要调用next()函数,因为生成器还没有启动,没有在yield语句处暂停,所以开始无法发送数据 # 发送 None 可以达到相同的效果 my_coro.send(None) next(my_coro) # 此时协程处于 GEN_SUSPENDED (在yield表达式处暂停) print(inspect.getgeneratorstate(my_coro)) # 调用这个方法后,协程定义体中的yield表达式会计算出42;现在协程会恢复,一直运行到下一个yield表达式,或者终止。 my_coro.send(42) print(inspect.getgeneratorstate(my_coro)) 运行上述代码,输出结果如下 ...

2017-06-12 · 4 min · 644 words

Amazon DynamoDB 入门8:删除项目

上一篇介绍了DynamoDB 的更新,这一篇将会介绍项目删除操作和dynamoab-py 从表中删除数据 在 SQL 中,DELETE 语句从表中删除一个或多个行。DynamoDB 使用 DeleteItem 操作一次删除一个项目。 SQL 在 SQL 中,可使用 DELETE 语句删除一个或多个行。WHERE 子句确定要修改的行。示例如下: HUGOMORE42 DELETE FROM Music WHERE Artist = ‘The Acme Band’ AND SongTitle = ‘Look Out, World’; 我们可以修改 WHERE 子句以删除多个行。例如,删除某个特殊艺术家的所有歌曲,如下所示: DELETE FROM Music WHERE Artist = ‘The Acme Band’ Note 如果省略 WHERE 子句,则数据库会尝试从表中删除所有行。 DynamoDB 在 DynamoDB 中,可使用 DeleteItem 操作修改单个项目。 (http://docs.aws.amazon.com/zh_cn/amazondynamodb/latest/APIReference/API_DeleteItem.html?shortFooter=true)[API 语法如下]: { "ConditionExpression": "string", "ExpressionAttributeNames": { "string" : "string" }, "ExpressionAttributeValues": { "string" : { "B": blob, "BOOL": boolean, "BS": [ blob ], "L": [ "AttributeValue" ], "M": { "string" : "AttributeValue" }, "N": "string", "NS": [ "string" ], "NULL": boolean, "S": "string", "SS": [ "string" ] } }, "Key": { "string" : { "B": blob, "BOOL": boolean, "BS": [ blob ], "L": [ "AttributeValue" ], "M": { "string" : "AttributeValue" }, "N": "string", "NS": [ "string" ], "NULL": boolean, "S": "string", "SS": [ "string" ] } }, "ReturnConsumedCapacity": "string", "ReturnItemCollectionMetrics": "string", "ReturnValues": "string", "TableName": "string" } 参数说明: ...

2017-03-03 · 3 min · 435 words

Amazon DynamoDB 入门7:项目更新

上一节介绍了DynamoDB 的查询,本来计划这一节介绍使用索引的查询,不过随机看到了更新操作,就先写更新操作吧 update (修改表中的数据) SQL 语言提供用于修改数据的 UPDATE 语句。DynamoDB 使用 UpdateItem 操作完成类似的任务。 SQL 在 SQL 中,可使用 UPDATE 语句修改一个或多个行。SET 子句为一个或多个列指定新值,WHERE 子句确定修改的行。示例如下: UPDATE Music SET RecordLabel = 'Global Records' WHERE Artist = 'No One You Know' AND SongTitle = 'Call Me Today'; HUGOMORE42 如果任何行均不匹配 WHERE 子句,则 UPDATE 语句不起作用。 DynamoDB 在 DynamoDB 中,可使用 UpdateItem 操作修改单个项目。 API 语法如下: { "AttributeUpdates": { "string" : { "Action": "string", "Value": { "B": blob, "BOOL": boolean, "BS": [ blob ], "L": [ "AttributeValue" ], "M": { "string" : "AttributeValue" }, "N": "string", "NS": [ "string" ], "NULL": boolean, "S": "string", "SS": [ "string" ] } } }, "ConditionalOperator": "string", "ConditionExpression": "string", "Expected": { "string" : { "AttributeValueList": [ { "B": blob, "BOOL": boolean, "BS": [ blob ], "L": [ "AttributeValue" ], "M": { "string" : "AttributeValue" }, "N": "string", "NS": [ "string" ], "NULL": boolean, "S": "string", "SS": [ "string" ] } ], "ComparisonOperator": "string", "Exists": boolean, "Value": { "B": blob, "BOOL": boolean, "BS": [ blob ], "L": [ "AttributeValue" ], "M": { "string" : "AttributeValue" }, "N": "string", "NS": [ "string" ], "NULL": boolean, "S": "string", "SS": [ "string" ] } } }, "ExpressionAttributeNames": { "string" : "string" }, "ExpressionAttributeValues": { "string" : { "B": blob, "BOOL": boolean, "BS": [ blob ], "L": [ "AttributeValue" ], "M": { "string" : "AttributeValue" }, "N": "string", "NS": [ "string" ], "NULL": boolean, "S": "string", "SS": [ "string" ] } }, "Key": { "string" : { "B": blob, "BOOL": boolean, "BS": [ blob ], "L": [ "AttributeValue" ], "M": { "string" : "AttributeValue" }, "N": "string", "NS": [ "string" ], "NULL": boolean, "S": "string", "SS": [ "string" ] } }, "ReturnConsumedCapacity": "string", "ReturnItemCollectionMetrics": "string", "ReturnValues": "string", "TableName": "string", "UpdateExpression": "string" } 参数说明: ...

2017-02-07 · 4 min · 816 words

Amazon DynamoDB 入门6:query 和 scan

上一节我们介绍了DynamoDB索引的创建及管理,这一节我们将介绍query(查询)和scan(扫描)的使用。 查询Query SQL 可使用 SELECT 语句查询关键列、非关键列或任意组合。WHERE 子句确定返回的行。 DynamoDB Query 操作提供对存储数据的物理位置的快速高效访问。 可以将 Query 用于任何具有复合主键(分区键和排序键)的表。这里的表必须指定分区键的相等条件,并且可以选择性为排序键提供另一个条件。 KeyConditionExpression 参数指定要查询的键值。 HUGOMORE42 可使用可选 FilterExpression 在结果中的找出某些符号条件的项目。 在 DynamoDB 中,必须使用 ExpressionAttributeValues 作为表达式参数(例如,KeyConditionExpression和 FilterExpression)中的占位符。这类似于在关系数据库中使用绑定变量,在运行时将实际值代入 SELECT语句。 下边是query的语法: response = table.query( IndexName='string', Select='ALL_ATTRIBUTES'|'ALL_PROJECTED_ATTRIBUTES'|'SPECIFIC_ATTRIBUTES'|'COUNT', AttributesToGet=[ 'string', ], Limit=123, ConsistentRead=True|False, ConditionalOperator='AND'|'OR', ScanIndexForward=True|False, ExclusiveStartKey={ 'string': 'string'|123|Binary(b'bytes')|True|None|set(['string'])|set([123])|set([Binary(b'bytes')])|[]|{} }, ReturnConsumedCapacity='INDEXES'|'TOTAL'|'NONE', ProjectionExpression='string', FilterExpression=Attr('myattribute').eq('myvalue'), KeyConditionExpression=Key('mykey').eq('myvalue'), ExpressionAttributeNames={ 'string': 'string' }, ExpressionAttributeValues={ 'string': 'string'|123|Binary(b'bytes')|True|None|set(['string'])|set([123])|set([Binary(b'bytes')])|[]|{} } ) 参数说明: ...

2017-01-31 · 4 min · 766 words

Amazon DynamoDB 入门5:索引创建及管理

上一节我们介绍了项目的添加、修改、获取、删除(CRUD)操作,这一节将介绍索引的创建及管理。 创建索引 SQL 在关系数据库中,索引是一个数据结构,可对表中的不同的列执行快速查询。可以使用 CREATE INDEX SQL 语句将索引添加到现有表,并指定要建立索引的列。在创建索引后,可以照常查询表中的数据,但现在数据库可使用索引快速查找表中的指定行,而不是扫描整个表。 在创建一个索引后,数据库将自动维护此索引。只要修改表中的数据,就会自动更改索引以反映表中的更改。 HUGOMORE42 在 MySQL 中,您可以创建如下所示的索引: CREATE INDEX GenreAndPriceIndex ON Music (genre, price); DynamoDB 在 DynamoDB 中,我们可以创建和使用secondary index来实现类似目的。 DynamoDB 中的索引与其关系对应项不同。当我们创建secondary index时,必须指定其键属性 - 分区键和排序键。 在创建secondary index后,我们可以对它执行 Query 或 Scan 操作,就如同对表执行这些操作一样。 DynamoDB 没有查询优化程序,因此,仅在我们对secondary index执行 Query 或 Scan 操作时使用它。 DynamoDB 支持两种不同的索引: 全局二级索引 - 索引的主键可以是其表中的任意两个属性(可以在创建表时创建,也可以向现有表添加新全局二级索引,或者删除现有的全局二级索引)。 本地二级索引 - 索引的分区键必须与其表的分区键相同。不过,排序键可以是任何其他属性(是在创建表的同时创建的。不能向现有表添加本地二级索引,也不能删除已存在的任何本地二级索引)。 DynamoDB 确保secondary index中的数据最终与其表保持一致。我们可以请求对表或local secondary index执行强一致性 Query 或 Scan 操作。但是,全局二级索引仅支持最终一致性。 可使用 UpdateTable 操作并指定 GlobalSecondaryIndexUpdates 来将global secondary index添加到现有表: { TableName: "Music", AttributeDefinitions:[ {AttributeName: "Genre", AttributeType: "S"}, {AttributeName: "Price", AttributeType: "N"} ], GlobalSecondaryIndexUpdates: [ { Create: { IndexName: "GenreAndPriceIndex", KeySchema: [ {AttributeName: "Genre", KeyType: "HASH"}, //Partition key {AttributeName: "Price", KeyType: "RANGE"}, //Sort key ], Projection: { "ProjectionType": "ALL" }, ProvisionedThroughput: { "ReadCapacityUnits": 1,"WriteCapacityUnits": 1 } } } ] } 添加索引时必须向 UpdateTable 提供以下参数: ...

2017-01-18 · 3 min · 520 words

Amazon DynamoDB 入门4:项目的基本操作(CRUD)

上一节我们介绍了DynamoDB 表的操作,这一节将介绍项目的添加 修改 获取 删除操作。 创建项目 Amazon DynamoDB 提供了 PutItem 和 BatchWriteItem 两种方式写入数据 添加单个项目 在 Amazon DynamoDB 中,使用 PutItem 操作向表添加项目: HUGOMORE42 { TableName: "Music", Item: { "Artist":"No One You Know", "SongTitle":"Call Me Today", "AlbumTitle":"Somewhat Famous", "Year": 2015, "Price": 2.14, "Genre": "Country", "Tags": { "Composers": [ "Smith", "Jones", "Davis" ], "LengthInSeconds": 214 } } } 此表的主键包含 Artist 和 SongTitle。您必须为这些属性指定值。 以下是要了解的有关此 PutItem 示例的几个关键事项: ...

2017-01-18 · 5 min · 991 words

Amazon DynamoDB 入门3: 表的基本操作

之前两篇文章介绍了DynamoDB如何在本地安装以及基本的工作原理和API,这一节主要介绍如何使用DynamoDB。 基本的DynamoDB 操作包括表操作、项目操作和索引管理。 首先是链接数据库。和关系型数据库不同,DynamoDB 是一项 Web 服务,与其进行的交互是无状态的。应用程序不需要维护持久性网络连接。相反,与 DynamoDB 的交互是通过 HTTP(S) 请求和响应进行的。 HUGOMORE42 执行某项操作的步骤为: 应用程序将 HTTP(S) 请求发送到 DynamoDB。该请求包含要执行的 DynamoDB 操作的名称和参数。DynamoDB 将立即执行请求。 DynamoDB 返回一个包含操作结果的 HTTP(S) 响应。如果出错,DynamoDB 将返回 HTTP 错误状态和消息。 大多数情况下,我们编写应用程序代码访问DynamoDB。同时还可以使用 AWS 管理控制台或 AWS Command Line Interface (AWS CLI) 向 DynamoDB 发送临时请求并查看结果。 剩下的就让我们用代码展示吧! 表操作 我们知道,关系模型需要一个明确定义的架构,其中,数据将标准化为表、列和行。此外,在表、列、索引和其他数据库元素之间定义所有关系。但 DynamoDB 不同,DynamoDB 没有架构。每个表必须具有一个用来唯一标识每个数据项目的主键,但对其他非键属性没有类似的约束。DynamoDB 可以管理结构化或半结构化的数据,包括 JSON 文档。 表是关系数据库和 DynamoDB 中的基本数据结构。关系数据库管理系统 (RDBMS) 要求在创建表时定义表的架构。相比之下,DynamoDB 表没有架构 - 与主键不同,我们在创建表时无需定义任何属性或数据类型。 新建表 DynamoDB 使用 CreateTable 操作创建表,并指定参数,请求语法如下所示: { "AttributeDefinitions": [ { "AttributeName": "string", "AttributeType": "string" } ], "GlobalSecondaryIndexes": [ { "IndexName": "string", "KeySchema": [ { "AttributeName": "string", "KeyType": "string" } ], "Projection": { "NonKeyAttributes": [ "string" ], "ProjectionType": "string" }, "ProvisionedThroughput": { "ReadCapacityUnits": number, "WriteCapacityUnits": number } } ], "KeySchema": [ { "AttributeName": "string", "KeyType": "string" } ], "LocalSecondaryIndexes": [ { "IndexName": "string", "KeySchema": [ { "AttributeName": "string", "KeyType": "string" } ], "Projection": { "NonKeyAttributes": [ "string" ], "ProjectionType": "string" } } ], "ProvisionedThroughput": { "ReadCapacityUnits": number, "WriteCapacityUnits": number }, "StreamSpecification": { "StreamEnabled": boolean, "StreamViewType": "string" }, "TableName": "string" } 必须向 CreateTable 提供以下参数: ...

2017-01-14 · 3 min · 611 words

Amazon DynamoDB 入门2: 工作原理、API和数据类型介绍

本节主要介绍DynamoDB 基本概念、核心组件、数据结构、Api DynamoDB工作原理 DynamoDB 基本概念 DynamoDB 是 AWS 独有的完全托管的 NoSQL Database。它的思想来源于 Amazon 2007 年发表的一篇论文:Dynamo: Amazon’s Highly Available Key-value Store。在这篇论文里,Amazon 介绍了如何使用 Commodity Hardware 来打造高可用、高弹性的数据存储。想要理解 DynamoDB,首先要理解 Consistent Hashing。Consistent Hashing 的原理如下图所示: HUGOMORE42 它的概念是: 我有一个足够大的Keyspace(2的160次方,比较一下:IPv6是2的128次方),我们记作X。 然后将X放在一个环形的空间里划分成大小相等的Y个 Partition,依次循环排列(如图),每个 Partition 由一个Vnode(Riak的概念)管理, 当你有M个Database Server(Node),Y个Vnode再平均映射到M个Node上。 当数据要插入时,将其主键(Hash Key)映射到K中的一个地址(Addr),对应到某个Vnode,再进一步对应到某个Node,如果这个数据需要N个Replica,则将数据写入Addr(Vnode a),Addr + 1(Vnode b), …,Add + N(Vnode n)。 这里,M就是你的Shards,N是Replica。 以后添加新的Node时,映射发生变化,只需要把相应的变化了的Vnode迁移到新的Node上即可。在这种结构下,Sharding/Replica对程序员基本上是透明的。 DynamoDB 核心组件 基本 DynamoDB 组件包括:表、项目、属性 表 - 类似于其他数据库系统,DynamoDB将数据存储在表中。表是数据的集合。(类似于关系型数据库中的表) 项目 - 每个表包含多个项目。项目是一组属性,具有不同于所有其他项目的唯一标识。(类似于其他数据库系统中的行、记录或元组。) 属性 - 每个项目包含一个或多个属性。属性是基础的数据元素,无需进一步分解。(类似于其他数据库系统中的字段或列。) 下图是一个名为 People 的表,其中显示了一些示例项目和属性: 请注意有关 People 表的以下内容: ...

2017-01-09 · 4 min · 652 words

Amazon DynamoDB 入门1:配置(本地)及python示例

本节主要介绍AmazonDynamoDB 安装配置及Python开发示例" 什么是 Amazon DynamoDB Amazon DynamoDB 是一种完全托管的 NoSQL 数据库服务,提供快速而可预测的性能,能够实现无缝扩展。使用 DynamoDB,您可以免除操作和扩展分布式数据库的管理工作负担,因而无需担心硬件预置、设置和配置、复制、软件修补或集群扩展等问题。 使用 DynamoDB,您可以创建数据库表来存储和检索任意量级的数据,并提供任意级别的请求流量。您可以扩展或缩减您的表的吞吐容量,而不会导致停机或性能下降,还可以使用 AWS 管理控制台来监控资源使用情况和各种性能指标。 HUGOMORE42 Amazon DynamoDB 特点 DynamoDB 会自动将数据和流量分散到足够数量的服务器上,以满足吞吐量和存储需求,同时保持始终如一的高性能。所有数据均存储在固态硬盘 (SSD) 中,并会自动复制到 AWS 区域中的多个可用区中,从而提供内置的高可用性和数据持久性。 DynamoDB 是 NoSQL 数据库并且无架构,这意味着,与主键属性不同,无需在创建表时定义任何属性或数据类型。与此相对,关系数据库要求在创建表时定义每个列的名称和数据类型。 Amazon DynamoDB 使用 AWS 配置 注册 Amazon Web Services 并创建访问密钥 创建 AWS 凭证文件 开启DynamoDB 服务 在计算机上运行 DynamoDB 除了 Amazon DynamoDB Web 服务之外,AWS 还提供可本地运行的可下载版本的 DynamoDB。 使用本地版本,在开发应用程序时无需 Internet 连接。 方法1 直接在计算机上安装 需要安装java环境 下载 DynamoDB 解压,并将解压后的目录复制到某个位置 打开命令提示符窗口,打开 DynamoDBLocal.jar 的目录,并输入以下命令: java -Djava.library.path=./DynamoDBLocal_lib -jar DynamoDBLocal.jar -sharedDb 现在就可以使用了 ...

2017-01-07 · 2 min · 304 words

网站微信登录-python 实现

最近我们的网站要加微信登录功能,找了python sdk 感觉都不满意,然后就参考instagram python sdk 自己造了轮子。 轮子 github 地址 python-weixin 根据需求选择相应的登录方式 微信现在提供两种登录接入方式 移动应用微信登录 网站应用微信登录 HUGOMORE42 这里我们使用的是网站应用微信登录 按照 官方流程 注册并通过开放平台开发者资质认证 注册微信开放平台帐号后,在帐号中心中填写开发者资质认证申请,并等待认证通过。 创建网站应用 通过填写网站应用名称、简介和图标,以及各平台下载地址等资料,创建网站应用 接入微信登录 在资源中心查阅网站应用开发文档,开发接入微信登陆功能,让用户可使用微信登录你的网站应用 如果已经完成上面的操作,请继续往下看 微信网站应用微信登录是基于OAuth2.0协议标准构建的微信OAuth2.0授权登录系统。 微信OAuth2.0授权登录目前支持authorization_code模式,适用于拥有server端的应用授权。该模式整体流程为: 第三方发起微信授权登录请求,微信用户允许授权第三方应用后,微信会拉起应用或重定向到第三方网站,并且带上授权临时票据code参数; 通过code参数加上AppID和AppSecret等,通过API换取access_token; 通过access_token进行接口调用,获取用户基本数据资源或帮助用户实现基本操作。 获取access_token 时序图 具体流程请参考官方文档,我们这里只说一下python的实现方法。官方文档地址 点这里 参考python-instagram 我写了一个 [python-weixin] (https://github.com/gusibi/python-weixin)一个微信python SDK 不过现在还只有微信接入、获取用户信息、 刷新refresh_token 等简单功能 安装 方法一 手动安装 首先 需要把代码clone到本地 python setup.py install 方法二 pip install pip install git+https://github.com/gusibi/python-weixin.git@master 使用方式 from weixin.client import WeixinAPI APP_ID = 'your app id' APP_SECRET = 'your app secret' REDIRECT_URI = 'http://your_domain.com/redirect_uri' # 这里一定要注意 地址一定要加上http/https scope = ("snsapi_login", ) api = WeixinAPI(appid=APP_ID, app_secret=APP_SECRET, redirect_uri=REDIRECT_URI) authorize_url = api.get_authorize_url(scope=scope) 现在将 authorize_url地址(如 http://yoursite.com/login/weixin)在浏览器打开, 将跳转到微信登录页面,使用手机扫码登录后将跳转到 ...

2016-09-05 · 2 min · 263 words