Twisted的Go风格频道

twisted-csp的Python项目详细描述


#twisted csp
为twisted通信顺序进程。像go或clojurescript的"core.async"这样的通道。

**警告:这是当前的alpha软件。**

这是clojurescript的"core.async"的非常接近的端口。显著的区别在于,轻量级进程是使用生成器(`yield`)而不是宏来实现的。

-通道操作必须在"轻量级进程"(代码流,而不是实际线程)内部进行。
-轻量级进程是通过调用'go`,`go`u channel`来生成的,`"延迟"或使用它们的decorator等价物。
-大多数通道操作必须遵循"yield do_sth(…)"的形式。

``python
def slow_pipe(input,output):
为真时:
value=yield take(input)
yield sleep(0.5)
如果value为none:#输入关闭
关闭(输出)
屈服点停止(
否则:
屈服点投入(输出,值)

开始(慢管道,通道1,通道2)
```

%s%d"%(消息,i))
产生睡眠(random.random())
i+=1
转到(计数器)
返回c



def main():
b=无聊("无聊!")
对于我,范围(5):
打印"你说:\"%s"%(收益率(b))
打印"你很无聊;我要走了。"
```

乒乓球(http://talks.golang.org/2013/advconc.slide 6)。
``python
类球:
命中=0

@process
def player(name,表:
如果为真:
ball=yield take(table)
ball.hits+=1
print name,ball.hits
yield sleep(0.1)
yield put(table,ball)


def main():
table=channel()

player("ping",table)
player("pong",表)

yield-put(table,ball())
yield-sleep(1)
````

timeout using`alts`(`select` in-go)(http://talks.golang.org/2012/concurrency.slide 35)。
``python
c=borning("joe")
为真:
value,chan=yield-alts([c,timeout(0.8))
C:
打印值
否则:
打印"您太慢了。"
yield stop()
````

例如,
``bash
./run example.go.timeout_for_whole_conversation_using_select
```

`examples下的示例是go示例的端口,来自:
-http://talks.golang.org/2012/concurrency.slide
-http://talks.golang.org/2013/advconc.slide.


repl"python

`` python
python 2.7.5+(默认值,2013年9月19日,13:48:49)
[gcc 4.8.1]关于linux2
键入"帮助"、"版权"、"信用"或"许可证"了解更多信息。
>;
>;从csp import导入线程
>;
>;从twisted.internet导入reactor
>;>thread.start_new_thread(reactor.run,),{"installsignalhandlers":false})
140038185355008
>;>类球:
…点击率=0

>;>def player(名称,表):
…如果是真的:
…球=屈服点(表)
…如果球没有:通道关闭
…打印姓名,"球不见了"
…中断
…击球+=1
…打印姓名,球。击中
…产生睡眠(0.1)
…收益率卖出(表,球)

>;>gt;def main():
…表=channel()
…去(玩家,"平",桌子)
…去(玩家,"乒乓球",桌子)
…产量投入(表,球())
…让出睡眠(1)
…关闭(表)

>;>;reactor.callfromthread(lambda:go(main))
>;&g乒乓球1
乒乓球2
乒乓球3
乒乓球4
乒乓球5
乒乓球6
乒乓球7
乒乓球8
>乒乓球9
>乒乓球10
>乒乓球10
>乒乓球没了
>乒乓球没了

>>>
>```

>
>
>>
>>
>
>乒乓球没了,乒乓球没了;
>
>
>
>
>
>乒乓球不适用于乒乓球,不适用于乒乓球不适用于a a不适用于a不适用。多线程环境,(这是可以修复的)。
-通道的正常api不能在进程之外使用(更准确地说,在进程的生成器函数之外)。
-生成器函数必须用于生成进程。这使得它比in-go(内置构造)或clojurescript(宏规则)更难组合。
-忘记"yield"可能会导致细微的错误。
-协同多处理(但不确定这是否是个大问题)。

发布/订阅。
-频道操作(映射、筛选器、reduce…。
-支持多线程环境(移植clojure的core.async而不是clojurescript)。
-编写**测试**。
-考虑一个合理的错误处理策略(我认为这应该由客户端代码而不是库代码决定)。
+如果有单独的错误频道?
+通道是否应该传递`(result,error)`元组?
+是否应将错误视为特殊值(捕获的异常[获取时重新引发](http://swannodette.github.io/2013/08/31/asynchronous error handling/)?
-支持其他反应器,例如[tornado](http://www.tornador web.org/en/stable/)(应该很容易,因为调度器是唯一依赖twisted的东西)。
-更多文档。
-更多示例(重点是利用twisted丰富的网络功能)。
-`put-then-callback`,` take_then_callback`如果结果立即可用,则在同一刻度内执行提供的回调。这可能会导致问题(特别是如果它们是公共api的话)。


_inspiration__

-http://swannodette.github.io/2013/08/24/es6生成器和csp
-https://github.com/clojure/core.async
-https://github.com/olahol/node csp

-http://code.google.com/p/pycsp/
-https://github.com/python concurrency/python csp
-https://github.com/stuglaser/pychan

这使得实现更简单(原则上),牺牲了效率(但管理线程/进程可能是一件麻烦事)。另一方面,它们更通用,并且支持网络通道(尽管这不一定是件好事)。

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

推荐PyPI第三方库


热门话题
java使用McClickListener单击了什么元素   Java时间戳在Oracle时间戳中不同情况下存储12 PM的奇怪行为   java无法使用事件总线对运行在不同机器上的垂直体进行通信   java Mockserver:收到请求后进行回调   java无法将Json字符串转换为Map<string,Object>   java如何按升序排列输出?   java视图行,带有oracle键。jbo。在SrCategoryParentIterator中找不到键[300100120394155]   javafxmysql连接示例   java正在等待加载完成   java是否可以将同一个有状态会话bean实例注入多个其他会话bean?   java无法让万向节检测离开或进入区域   使用JavaCV和OpenCV的java提供了dyld:lazy符号绑定失败:找不到符号:__sincos_stret   xml解析无法使用Java读取xml文档   java无法更改工具栏的颜色   javaapachesshd和JSCH   java无法在firebase存储中检索图像url   java问题与executeUpdate   同一应用程序中不同活动之间的java SharedReference