异步行为的承诺式数据封装
iou的Python项目详细描述
iou
==
类似承诺的数据封装,针对异步行为
tutorial
——
非常简单地说,iou提供了一种描述*如何*处理数据的方法,同时
允许您考虑*何时*数据将被二次使用。一个iou仅仅是一个包装器,用来包装将来将要提供的数据,说"当我们得到这些数据时,做其他的事情。"
iou1=iou()
iou1.add-completed处理程序(lambda x:print("original:",x))
plus-seven-iou=iou1.add-completed处理程序(lambda x:x+7)
plus-seven-iou.add-completed处理程序(lambda x:print("plus-seven:",x))
iou1.complete(10)用10
```
结果是:
````
原始值:10
加上7:17
```
那么,这里到底发生了什么?我们创建了最初的iou'iou1'。这是一个
包装器,用于将来可能提供的某些值。然后,我们使用
`iou1.add悻completed悻u handler`来表示何时实现了'iou1',调用
handler函数,该函数提供iou实现时所用的值。
在对
`iou1.add\u completed\u handler`的第一次调用中,我们没有对返回值做任何操作。
不过,在第二次调用中,您会注意到我们用'iou1.add\u completed\u handler'的结果分配了
`plus\u seven\u iou'。任何时候
您向一个iou添加一个已实现的处理程序,您都会收到另一个iou,该iou将用该处理程序的结果实现。因此,"plus-seven-iou"表示一个
iou,当用
iou1的值调用时,它将用"lambda x:x+7"的值来实现。
接下来,我们向"plus-seven-iou"添加一个打印处理程序来"打印它的值"。
最后,我们用值"10"来实现原始iou,"iou1"。通过这样做,
我们可以对整个ios链进行评估。
创建"iou1"
2。创建一个处理程序,打印用
3实现的值"iou1"id。制作一个iou("加七"iou),其值为"iou1"加7
4。创建一个处理程序,打印值'plus_seven_iou',用
5实现。使用值"10"来实现"iou1",导致实现的处理程序链执行
,这可能是一个不太有用的示例。但是让我们假设您的代码看起来像:
``python
e)
姓氏文本字段。设置文本(人名、姓氏)
````
主线程上的请求填写了IOU:
`` python
iou-aware person-from-server
person-iou=iou-for-person-from-server("ereinecke")
t_field.set_text(p.first_name))
person_iou.add_completed_handler(
lambda p:last_name_text_field.set_text(p.last_name))
````
这使得非阻塞api的实现相当简单。有关非阻塞http请求api的示例,请参见
`iou.httpreactor`子模块!
拒绝
就像ios可以*实现一样,它们也可以*拒绝*。也就是说,如果生成值以实现iou w时出错ith,它将被
拒绝,但有适当的例外。当发生这种情况时,不会调用任何
已实现的处理程序,而会调用被拒绝的处理程序,但有一个例外。此外,iou的值也将设置为
异常。拒绝处理程序的添加方式与complemented
处理程序类似,但可以使用"add_rejected_handler"。此方法还返回要用被拒绝处理程序的结果实现的
iou。
这是当处理者是另一个借据。在
这种情况下,处理程序iou被*链接*到您添加它的iou。
这意味着链接的iou将以与它所处理的iou相同的结果进行结算。
1=iou()
iou2=iou()
iou2.add-completed处理程序(print)
iou2.add-completed处理程序(lambda e:print("exception:",e))
iou1.add-completed处理程序(iou2)
iou1.reject(exception("bad stufhapped")
`````
f发生`
发生链接的另一个地方是,如果处理程序的*结果*是一个IOU,则当
发生这种情况时,您注册处理程序时获得的IOU将链接到结果IOU。今天,处理程序返回的iou也将完成您注册处理程序时获得的iou。这有助于其他promise系统的"then()"行为。
使用session对象,但要等到建立连接后,才能调用user_for_user name
user_iou=connection_iou.add_completed_handler(
lambda u:con.user_for_username('ereinecke')
lled_handler(lambda user:print("我正在删除:",user.name))
user_delete_iou=user_iou.add_completed_handler(lambda user:user.delete())
作为一个被拒绝的处理者?奇怪的东西。我愿意考虑在这里做什么,[告诉我!](https://github.com/reinecke/iou/issues/new)
ious的实现还有很多内容,我希望在不久的将来将其记录下来。
httpreactor
——
iou包中的httpreactor模块提供了ap实现的概念证明。我为iou感知的
请求模块提供了一个异步包装器。
下面是一个如何使用它从iou import http reactor获取http://www.python.org的示例:
``python
=http reactor.iouhttpreactor()
reactor.start()
/>请求结果添加满足的处理程序(lambda x:print(x.status_code))
`````
注意,没有一个调用被阻塞:)
project status
----
当前处于概念验证阶段。主要的todo是:
-完成文档
-创建一个连接到其他iou的iou?
-澄清线程行为
要进一步扩展,让iou系统能够使用线程池执行
实现/拒绝处理程序可能会很有趣。这样系统就可以
ha实现某种程度的自动并行化的机制。
同时感谢[Pix System,LLC.](http://www.pix system.com)鼓励我在公司时间内努力,支持共享到开源生态系统。
==
类似承诺的数据封装,针对异步行为
tutorial
——
非常简单地说,iou提供了一种描述*如何*处理数据的方法,同时
允许您考虑*何时*数据将被二次使用。一个iou仅仅是一个包装器,用来包装将来将要提供的数据,说"当我们得到这些数据时,做其他的事情。"
iou1=iou()
iou1.add-completed处理程序(lambda x:print("original:",x))
plus-seven-iou=iou1.add-completed处理程序(lambda x:x+7)
plus-seven-iou.add-completed处理程序(lambda x:print("plus-seven:",x))
iou1.complete(10)用10
```
结果是:
````
原始值:10
加上7:17
```
那么,这里到底发生了什么?我们创建了最初的iou'iou1'。这是一个
包装器,用于将来可能提供的某些值。然后,我们使用
`iou1.add悻completed悻u handler`来表示何时实现了'iou1',调用
handler函数,该函数提供iou实现时所用的值。
在对
`iou1.add\u completed\u handler`的第一次调用中,我们没有对返回值做任何操作。
不过,在第二次调用中,您会注意到我们用'iou1.add\u completed\u handler'的结果分配了
`plus\u seven\u iou'。任何时候
您向一个iou添加一个已实现的处理程序,您都会收到另一个iou,该iou将用该处理程序的结果实现。因此,"plus-seven-iou"表示一个
iou,当用
iou1的值调用时,它将用"lambda x:x+7"的值来实现。
接下来,我们向"plus-seven-iou"添加一个打印处理程序来"打印它的值"。
最后,我们用值"10"来实现原始iou,"iou1"。通过这样做,
我们可以对整个ios链进行评估。
创建"iou1"
2。创建一个处理程序,打印用
3实现的值"iou1"id。制作一个iou("加七"iou),其值为"iou1"加7
4。创建一个处理程序,打印值'plus_seven_iou',用
5实现。使用值"10"来实现"iou1",导致实现的处理程序链执行
,这可能是一个不太有用的示例。但是让我们假设您的代码看起来像:
``python
e)
姓氏文本字段。设置文本(人名、姓氏)
````
主线程上的请求填写了IOU:
`` python
iou-aware person-from-server
person-iou=iou-for-person-from-server("ereinecke")
t_field.set_text(p.first_name))
person_iou.add_completed_handler(
lambda p:last_name_text_field.set_text(p.last_name))
````
这使得非阻塞api的实现相当简单。有关非阻塞http请求api的示例,请参见
`iou.httpreactor`子模块!
拒绝
就像ios可以*实现一样,它们也可以*拒绝*。也就是说,如果生成值以实现iou w时出错ith,它将被
拒绝,但有适当的例外。当发生这种情况时,不会调用任何
已实现的处理程序,而会调用被拒绝的处理程序,但有一个例外。此外,iou的值也将设置为
异常。拒绝处理程序的添加方式与complemented
处理程序类似,但可以使用"add_rejected_handler"。此方法还返回要用被拒绝处理程序的结果实现的
iou。
这是当处理者是另一个借据。在
这种情况下,处理程序iou被*链接*到您添加它的iou。
这意味着链接的iou将以与它所处理的iou相同的结果进行结算。
1=iou()
iou2=iou()
iou2.add-completed处理程序(print)
iou2.add-completed处理程序(lambda e:print("exception:",e))
iou1.add-completed处理程序(iou2)
iou1.reject(exception("bad stufhapped")
`````
f发生`
发生链接的另一个地方是,如果处理程序的*结果*是一个IOU,则当
发生这种情况时,您注册处理程序时获得的IOU将链接到结果IOU。今天,处理程序返回的iou也将完成您注册处理程序时获得的iou。这有助于其他promise系统的"then()"行为。
使用session对象,但要等到建立连接后,才能调用user_for_user name
user_iou=connection_iou.add_completed_handler(
lambda u:con.user_for_username('ereinecke')
lled_handler(lambda user:print("我正在删除:",user.name))
user_delete_iou=user_iou.add_completed_handler(lambda user:user.delete())
作为一个被拒绝的处理者?奇怪的东西。我愿意考虑在这里做什么,[告诉我!](https://github.com/reinecke/iou/issues/new)
ious的实现还有很多内容,我希望在不久的将来将其记录下来。
httpreactor
——
iou包中的httpreactor模块提供了ap实现的概念证明。我为iou感知的
请求模块提供了一个异步包装器。
下面是一个如何使用它从iou import http reactor获取http://www.python.org的示例:
``python
=http reactor.iouhttpreactor()
reactor.start()
/>请求结果添加满足的处理程序(lambda x:print(x.status_code))
`````
注意,没有一个调用被阻塞:)
project status
----
当前处于概念验证阶段。主要的todo是:
-完成文档
-创建一个连接到其他iou的iou?
-澄清线程行为
要进一步扩展,让iou系统能够使用线程池执行
实现/拒绝处理程序可能会很有趣。这样系统就可以
ha实现某种程度的自动并行化的机制。
同时感谢[Pix System,LLC.](http://www.pix system.com)鼓励我在公司时间内努力,支持共享到开源生态系统。