Skip to main content

gocept.async provides asynchronous function calls using a decorator. It facilitates lovely.remotetask to actually do things asynchronously.

Details

It is often desirable to process computations asynchronously. Until there was lovely.remotetask this was not so easy to achieve in a Zope 3 application due to transaction integration issues.

gocept.async makes the task even easier:

>>> import gocept.async
>>> @gocept.async.function(service='events')
... def heavy_computing(a, b):
...     print "Computing", a, "+", b, "=", a + b

The decorator gocept.async.function takes exactly one argument, the name of a lovely.remotetask.interfaces.ITaskService utility. Note that gocept.async does not define any task service by itself.

Test Setup

Note that the decorated function must have an importable module to be usable:

>>> import gocept.async.tests
>>> heavy_computing.undecorated.__module__ = 'gocept.async.tests'
>>> gocept.async.tests.heavy_computing = heavy_computing

We defined task-service called events in this test:

>>> import zope.component
>>> import lovely.remotetask
>>> import lovely.remotetask.interfaces
>>> import lovely.remotetask.processor
>>> sm = zope.component.getSiteManager()
>>> getRootFolder()['tasks'] = tasks = lovely.remotetask.TaskService()
>>> tasks.processorFactory = lovely.remotetask.processor.MultiProcessor
>>> tasks.processorArguments = {'maxThreads': 1}
>>> sm.registerUtility(
...     tasks, lovely.remotetask.interfaces.ITaskService, name='events')

Basics

When the decorated function is called it returns nothing:

>>> heavy_computing(2, 7)

When we start the processing of the task service, the function is called:

>>> gocept.async.tests.process()
Computing 2 + 7 = 9

When the function is called while a user is logged in, the function will be called as that user (Note that it might be necessary to manually create security proxies to enable security in the async function.):

>>> @gocept.async.function('events')
... def who_am_i():
...     print gocept.async.task.TaskDescription.get_principal()
...
>>> who_am_i.undecorated.__module__ = 'gocept.async.tests'
>>> gocept.async.tests.who_am_i = who_am_i
>>> who_am_i()
>>> gocept.async.tests.process()

Now login:

>>> gocept.async.tests.login('zope.user')
>>> who_am_i()
>>> gocept.async.tests.process()
zope.user
>>> gocept.async.tests.logout()

If an async function is called while the process is already async’ed the function is called immediately:

>>> @gocept.async.function(service='events')
... def call_another():
...     print "Before"
...     heavy_computing(1, 2)
...     print "After"
>>> call_another.undecorated.__module__ = 'gocept.async.tests'
>>> gocept.async.tests.call_another = call_another
>>> call_another()
>>> gocept.async.tests.process()
Before
Computing 1 + 2 = 3
After

There is a helper to test if currenlty async is in progress:

>>> gocept.async.is_async()
False
>>> @gocept.async.function(service='events')
... def is_async_test():
...     print gocept.async.is_async()
>>> is_async_test.undecorated.__module__ = 'gocept.async.tests'
>>> gocept.async.tests.is_async_test = is_async_test
>>> is_async_test()
>>> gocept.async.tests.process()
True

Teardown

>>> sm.registerUtility(
...     tasks, lovely.remotetask.interfaces.ITaskService, name='events')
>>> del gocept.async.tests.heavy_computing
>>> del gocept.async.tests.who_am_i
>>> del gocept.async.tests.call_another
>>> del gocept.async.tests.is_async_test

Changes

0.3.3 (2011-04-05)

  • Replace deprecated zope.testing.doctest with stdlib’s doctest.

0.3.2 (2010-04-14)

  • Fix conflict error logging.

0.3.1 (2009-09-02)

  • Extracted a function to determine wether a function is run asynchronously or not.

0.3 (2009-07-31)

  • Remember the site that was active when the async function was defined and restore it when it is run.

0.2 (2009-04-16)

  • Made it even less likely that tests will raise ConflictErrors.

  • Fixed tests in README.

0.1.1 (2009-02-11)

  • Made it less likely that tests will raise ConflictErrors.

0.1 (2009-02-11)

  • first internal release.

Metadata

Release files for gocept.async 0.3.3

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for gocept.async 0.3.3
File Size Uploaded Provenance Actions
gocept.async-0.3.3.tar.gz 7.8 kB Without provenance Details for gocept.async-0.3.3.tar.gz

Release files / gocept.async-0.3.3.tar.gz

Download URL gocept.async-0.3.3.tar.gz
Size 7.8 kB
Tags Source
SHA-256 checksum
How to use checksums
7b6fa34c0d775a4553ef99842da6c48535945804083ee4d65e58f5800499779b
BLAKE2b-256 checksum
How to use checksums
7834d7e9af3d4b343bf513aaf0ed389fa3b17c1c4d009ec767c6393d0c8642df
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No

Security for gocept.async 0.3.3

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

No provenance found

None of the files in this release were uploaded with provenance metadata.

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page