编写无回调的计算密集型非阻塞代码
cooperative的Python项目详细描述
合作
编写非阻塞的计算代价高昂的代码,与非阻塞IO一起使用,而不需要 必须考虑回拨中的所有内容。
batch_accumulate将在生成器上成批迭代,从而产生其他迭代器
传入twisted.internet.task.cooperate
示例
#!/usr/bin/env python # _*_ coding: utf-8 _*_ from operator import add import sys from twisted.internet import defer from twisted.internet.task import react from twisted.python import log from cooperative import batch_accumulate def expensive(number): log.msg("starting {}".format(number)) for value in range(100000): if 25000 == value: log.msg("1/4 for {}".format(number)) if 50000 == value: log.msg("1/2 for {}".format(number)) if 75000 == value: log.msg("3/4 for {}".format(number)) yield number * value / 3.0 @defer.inlineCallbacks def do_some_expensive_things(number): """ Perform one expensive computation cooperatively with any other iterator passed into twisted's cooperate, then use it's result to pass into the second computation. :param number: :return: """ result = yield batch_accumulate(1000, expensive(number)) total = reduce(add, result, 0) log.msg("first for {}: {}".format(number, total)) result = yield batch_accumulate(1000, expensive(int(total/1e9))) total = reduce(add, result, 0) log.msg("second for {}: {}".format(number, total)) defer.returnValue(total) def main(reactor): d1 = do_some_expensive_things(54.0) d2 = do_some_expensive_things(42) d3 = do_some_expensive_things(10) d4 = do_some_expensive_things(34) # Enqueue events to simulate handling external events d5 = defer.Deferred().addCallback(log.msg) reactor.callLater(0.3, d5.callback, "########## simulated request 1 ############") d6 = defer.Deferred().addCallback(log.msg) reactor.callLater(0.5, d6.callback, "########## sim request 2 ############") d7 = defer.Deferred().addCallback(log.msg) reactor.callLater(1.0, d7.callback, "########## simulated request 3 ############") return defer.gatherResults([d1, d2, d3, d4, d5, d6, d7]).addCallback(log.msg) if __name__ == "__main__": log.startLogging(sys.stdout) react(main, [])
贡献:
在这里提交任何问题:https://github.com/johnwlockwood/cooperative/issues。
- 向development的分支发出pull请求
- https://github.com/johnwlockwood/cooperative.
- documentation是用structuredtext编写的,当前使用
- 狮身人面像风格 列表http://sphinx-doc.org/domains.html#info-field-lists
查看关闭的pull请求,查看开发流程 对master的每个更改都是通过github上的pull请求完成的。代码评审 是受欢迎的,即使是合并的请求。请随意提问 代码。