Write computationally intensive non-blocking code without callbacks
Project description
Cooperative
Write non-blocking computationally expensive code to go along with non-blocking io, without having to think about everything in callbacks.
batch_accumulate will iterate over a generator in batches, yielding to other iterators passed into twisted.internet.task.cooperate
Example
#!/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, [])
Documentation
Read the docs: http://cooperative.readthedocs.org/en/latest/
Contributing:
Submit any issues or questions here: https://github.com/johnwlockwood/cooperative/issues.
- Make pull requests to development branch of
- Documentation is written in reStructuredText and currently uses the
Sphinx style for field lists http://sphinx-doc.org/domains.html#info-field-lists
Check out closed pull requests to see the flow of development, as almost every change to master is done via a pull request on GitHub. Code Reviews are welcome, even on merged Pull Requests. Feel free to ask questions about the code.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file cooperative-0.1.12.tar.gz.
File metadata
- Download URL: cooperative-0.1.12.tar.gz
- Upload date:
- Size: 21.4 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: Python-urllib/3.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
e063aa5c2e85db73353f470774dcb495a712ee972729ea244df7d5f8b9a1e355
|
|
| MD5 |
7b4f279cc1076b0a568557fad960ced2
|
|
| BLAKE2b-256 |
216c1befd2eee8c29c54337b52c375f2eed917e3e21dd239372a075af4e02110
|
File details
Details for the file cooperative-0.1.12-py3.7.egg.
File metadata
- Download URL: cooperative-0.1.12-py3.7.egg
- Upload date:
- Size: 13.4 kB
- Tags: Egg
- Uploaded using Trusted Publishing? No
- Uploaded via: Python-urllib/3.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
d388bbb39ecdcd8d95d8226a348e045e23a4679ad1d2fc6a713b7ba86d4beca0
|
|
| MD5 |
08250f9be770b4dc9cc76e8e9ba7a36f
|
|
| BLAKE2b-256 |
f129044f7765f5f7c71c9b5f0f6fba87b682edb102445410c858c48f8eb615a5
|