异步行为的承诺式数据封装

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)鼓励我在公司时间内努力,支持共享到开源生态系统。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
tomcat Java条带错误   java OPENTSDB fsck修复程序不更正重复点   java JavaFX在控制器内切换自身的可见性   java maven surefire插件未并行执行运行程序   读取导致Freemarker模板引擎中TemplateException的Java对象   无法使Java库与我的Android应用程序一起工作   安卓 java。lang.IllegalStateException游标   使用Java检索XML文件中的XSL URL和名称   java如何从文本文件集合中提取特定值   电子邮件java mail gmail   java为什么finalize()只被垃圾收集器调用一次?   java方法findViewById(int)对于Json类型是未定义的。蛇形   java在安卓中尝试从brother打印机打印位图时遇到以下异常   java在颤振中支持Kotlin的优势   java从后面编写文本   java制作列表。第一个列表可以有相同的数字,第二个将是价格,尝试制作第三个列表,如果它们是相同的数字,它将添加价格