Skip to main content

Quora's asynq library

Project description

http://i.imgur.com/jCPNyOa.png

asynq is a library for asynchronous programming in Python with a focus on batching requests to external services. It also provides seamless interoperability with synchronous code, support for asynchronous context managers, and tools to make writing and testing asynchronous code easier. asynq was developed at Quora and is a core component of Quora’s architecture. See the original blog post here.

The most important use case for asynq is batching. For many storage services (e.g., memcache, redis) it is far faster to make a single request that fetches many keys at once than to make many requests that each fetch a single key. The asynq framework makes it easy to write code that takes advantage of batching without radical changes in code structure from code that does not use batching.

For example, synchronous code to retrieve the names of the authors of a list of Quora answers may look like this:

def all_author_names(aids):
    uids = [author_of_answer(aid) for aid in aids]
    names = [name_of_user(uid) for uid in uids]
    return names

Here, each call to author_of_answer and name_of_user would result in a memcache request. Converted to use asynq, this code would look like:

@asynq()
def all_author_names(aids):
    uids = yield [author_of_answer.asynq(aid) for aid in aids]
    names = yield [name_of_user.asynq(uid) for uid in uids]
    return names

All author_of_answer calls will be combined into a single memcache request, as will all of the name_of_user calls.

Futures

Futures are the basic building blocks of asynq’s programming model. The scheduler keeps track of futures and attempts to schedule them in an efficient way. asynq uses its own hierarchy of Future classes, rooted in asynq.FutureBase. Futures have a .value() method that computes their value if necessary and then returns it.

The following are the most important Future classes used in asynq:

  • AsyncTask, a Future representing the execution of an asynchronous function (see below). Normally created by calling .asynq() on an asynchronous function.

  • ConstFuture, a Future whose value is known at creation time. This is useful when you need to pass a Future somewhere, but no computation is actually needed.

  • BatchBase and BatchItemBase, the building blocks for doing batching. See below for details.

Decorators and asynchronous functions

asynq’s asynchronous functions are implemented as Python generator functions. Every time an asynchronous functions yields one or more Futures, it cedes control the asynq scheduler, which will resolve the futures that were yielded and continue running the function after the futures have been computed.

The framework requires usage of the @asynq() decorator on all asynchronous functions. This decorator wraps the generator function so that it can be called like a normal, synchronous function. It also creates a .asynq attribute on the function that allows calling the function asynchronously. Calling this attribute will return an AsyncTask object corresponding to the function.

You can call an asynchronous function synchronously like this:

result = async_fn(a, b)

and asynchronously like this:

result = yield async_fn.asynq(a, b)

Calling async_fn.asynq(a, b).value() has the same result as async_fn(a, b).

The decorator has a pure=True option that disables the .asynq attribute and instead makes the function itself asynchronous, so that calling it returns an AsyncTask. We recommend to use this option only in special cases like decorators for asynchronous functions.

asynq also provides an @async_proxy() decorator for functions that return a Future directly. Functions decorated with @async_proxy() look like @asynq() functions externally. An example use case is a function that takes either an asynchronous or a synchronous function, and calls it accordingly:

@async_proxy()
def async_call(fn, *args, **kwargs):
    if is_async_fn(fn):
        # Returns an AsyncTask
        return fn.asynq(*args, **kwargs)
    return ConstFuture(fn(*args, **kwargs))

Batching

Batching is at the core of what makes asynq useful. To implement batching, you need to subclass asynq.BatchItemBase and asynq.BatchBase. The first represents a single entry in a batch (e.g., a single memcache key to fetch) and the second is responsible for executing the batch when the scheduler requests it.

Batch items usually do not require much logic beyond registering themselves with the currently active batch in __init__. Batches need to override the _try_switch_active_batch method, which changes the batch that is currently active, and the _flush method that executes it. This method should call .set_value() on all the items in the batch.

An example implementation of batching for memcache is in the asynq/examples/batching.py file. The framework also provides a DebugBatchItem for testing.

Most users of asynq should not need to implement batches frequently. At Quora, we use thousands of asynchronous functions, but only five BatchBase subclasses.

Contexts

asynq provides support for Python context managers that are automatically activated and deactivated when a particular task is scheduled. This feature is necessary because the scheduler can schedule tasks in arbitrary order. For example, consider the following code:

@asynq()
def show_warning():
    yield do_something_that_creates_a_warning.asynq()

@asynq()
def suppress_warning():
    with warnings.catch_warnings():
        yield show_warning.asynq()

@asynq()
def caller():
    yield show_warning.asynq(), suppress_warning.asynq()

This code should show only one warning, because only the second call to show_warning is within a catch_warnings() context, but depending on how the scheduler happens to execute these functions, the code that shows the warning may also be executed while catch_warnings() is active.

To remedy this problem, you should use an AsyncContext, which will be automatically paused when the task that created it is no longer active and resumed when it becomes active again. An asynq-compatible version of catch_warnings would look something like this:

class catch_warnings(asynq.AsyncContext):
    def pause(self):
        stop_catching_warnings()

    def resume(self):
        start_catching_warnings()

Debugging

Because the asynq scheduler is invoked every time an asynchronous function is called, and it can invoke arbitrary other active futures, normal Python stack traces become useless in a sufficiently complicated application built on asynq. To make debugging easier, the framework provides the ability to generate a custom asynq stack trace, which shows how each active asynchronous function was invoked.

The asynq.debug.dump_asynq_stack() method can be used to print this stack, similar to traceback.print_stack(). The framework also registers a hook to print out the asynq stack when an exception happens.

Tools

asynq provides a number of additional tools to make it easier to write asynchronous code. Some of these are in the asynq.tools module. These tools include:

  • asynq.async_call calls a function asynchronously only if it is asynchronous. This can be useful when calling an overridden method that is asynchronous on some child classes but not on others.

  • asynq.tools.call_with_context calls an asynchronous function within the provided context manager. This is helpful in cases where you need to yield multiple tasks at once, but only one needs to be within the context.

  • asynq.tools.afilter and asynq.tools.asorted are equivalents of the standard filter and sorted functions that take asynchronous functions as their filter and compare functions.

  • asynq.tools.acached_per_instance caches an asynchronous instance method.

  • asynq.tools.deduplicate prevents multiple simultaneous calls to the same asynchronous function.

  • The asynq.mock module is an enhancement to the standard mock module that makes it painless to mock asynchronous functions. Without this module, mocking any asynchronous function will often also require mocking its .asynq attribute. We recommend using asynq.mock.patch for all mocking in projects that use asynq.

  • The asynq.generator module provides an experimental implementation of asynchronous generators, which can produce a sequence of values while also using asynq’s batching support.

Compatibility

asynq runs on Python 3.8 and newer.

Previous versions of asynq used the name async for the @asynq() decorator and the .asynq attribute. Because async is a keyword in recent versions of Python 3, we now use the spelling asynq in both places. asynq version 1.3.0 drops support for the old spelling.

Contributors

Alex Yakunin, Jelle Zijlstra, Manan Nayak, Martin Michelsen, Shrey Banga, Suren Nihalani, Suchir Balaji and other engineers at Quora.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

asynq-1.6.0.tar.gz (65.9 kB view details)

Uploaded Source

Built Distributions

asynq-1.6.0-pp310-pypy310_pp73-win_amd64.whl (579.6 kB view details)

Uploaded PyPy Windows x86-64

asynq-1.6.0-pp310-pypy310_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (675.7 kB view details)

Uploaded PyPy manylinux: glibc 2.17+ x86-64 manylinux: glibc 2.5+ x86-64

asynq-1.6.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl (686.5 kB view details)

Uploaded PyPy manylinux: glibc 2.17+ i686 manylinux: glibc 2.5+ i686

asynq-1.6.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl (572.2 kB view details)

Uploaded PyPy macOS 10.15+ x86-64

asynq-1.6.0-pp39-pypy39_pp73-win_amd64.whl (578.6 kB view details)

Uploaded PyPy Windows x86-64

asynq-1.6.0-pp39-pypy39_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (674.2 kB view details)

Uploaded PyPy manylinux: glibc 2.17+ x86-64 manylinux: glibc 2.5+ x86-64

asynq-1.6.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl (685.4 kB view details)

Uploaded PyPy manylinux: glibc 2.17+ i686 manylinux: glibc 2.5+ i686

asynq-1.6.0-pp39-pypy39_pp73-macosx_10_15_x86_64.whl (571.2 kB view details)

Uploaded PyPy macOS 10.15+ x86-64

asynq-1.6.0-cp313-cp313-win_amd64.whl (636.3 kB view details)

Uploaded CPython 3.13 Windows x86-64

asynq-1.6.0-cp313-cp313-win32.whl (566.9 kB view details)

Uploaded CPython 3.13 Windows x86

asynq-1.6.0-cp313-cp313-musllinux_1_2_x86_64.whl (3.8 MB view details)

Uploaded CPython 3.13 musllinux: musl 1.2+ x86-64

asynq-1.6.0-cp313-cp313-musllinux_1_2_i686.whl (3.7 MB view details)

Uploaded CPython 3.13 musllinux: musl 1.2+ i686

asynq-1.6.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (3.9 MB view details)

Uploaded CPython 3.13 manylinux: glibc 2.17+ x86-64

asynq-1.6.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl (3.7 MB view details)

Uploaded CPython 3.13 manylinux: glibc 2.17+ i686 manylinux: glibc 2.5+ i686

asynq-1.6.0-cp313-cp313-macosx_10_13_x86_64.whl (697.3 kB view details)

Uploaded CPython 3.13 macOS 10.13+ x86-64

asynq-1.6.0-cp312-cp312-win_amd64.whl (643.8 kB view details)

Uploaded CPython 3.12 Windows x86-64

asynq-1.6.0-cp312-cp312-win32.whl (572.0 kB view details)

Uploaded CPython 3.12 Windows x86

asynq-1.6.0-cp312-cp312-musllinux_1_2_x86_64.whl (3.9 MB view details)

Uploaded CPython 3.12 musllinux: musl 1.2+ x86-64

asynq-1.6.0-cp312-cp312-musllinux_1_2_i686.whl (3.8 MB view details)

Uploaded CPython 3.12 musllinux: musl 1.2+ i686

asynq-1.6.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (4.0 MB view details)

Uploaded CPython 3.12 manylinux: glibc 2.17+ x86-64

asynq-1.6.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl (3.7 MB view details)

Uploaded CPython 3.12 manylinux: glibc 2.17+ i686 manylinux: glibc 2.5+ i686

asynq-1.6.0-cp312-cp312-macosx_10_13_x86_64.whl (711.5 kB view details)

Uploaded CPython 3.12 macOS 10.13+ x86-64

asynq-1.6.0-cp311-cp311-win_amd64.whl (655.0 kB view details)

Uploaded CPython 3.11 Windows x86-64

asynq-1.6.0-cp311-cp311-win32.whl (585.7 kB view details)

Uploaded CPython 3.11 Windows x86

asynq-1.6.0-cp311-cp311-musllinux_1_2_x86_64.whl (3.9 MB view details)

Uploaded CPython 3.11 musllinux: musl 1.2+ x86-64

asynq-1.6.0-cp311-cp311-musllinux_1_2_i686.whl (3.8 MB view details)

Uploaded CPython 3.11 musllinux: musl 1.2+ i686

asynq-1.6.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (4.0 MB view details)

Uploaded CPython 3.11 manylinux: glibc 2.17+ x86-64

asynq-1.6.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl (3.8 MB view details)

Uploaded CPython 3.11 manylinux: glibc 2.17+ i686 manylinux: glibc 2.5+ i686

asynq-1.6.0-cp311-cp311-macosx_10_9_x86_64.whl (713.7 kB view details)

Uploaded CPython 3.11 macOS 10.9+ x86-64

asynq-1.6.0-cp310-cp310-win_amd64.whl (652.7 kB view details)

Uploaded CPython 3.10 Windows x86-64

asynq-1.6.0-cp310-cp310-win32.whl (587.0 kB view details)

Uploaded CPython 3.10 Windows x86

asynq-1.6.0-cp310-cp310-musllinux_1_2_x86_64.whl (3.6 MB view details)

Uploaded CPython 3.10 musllinux: musl 1.2+ x86-64

asynq-1.6.0-cp310-cp310-musllinux_1_2_i686.whl (3.4 MB view details)

Uploaded CPython 3.10 musllinux: musl 1.2+ i686

asynq-1.6.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (3.7 MB view details)

Uploaded CPython 3.10 manylinux: glibc 2.17+ x86-64

asynq-1.6.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl (3.5 MB view details)

Uploaded CPython 3.10 manylinux: glibc 2.17+ i686 manylinux: glibc 2.5+ i686

asynq-1.6.0-cp310-cp310-macosx_10_9_x86_64.whl (710.7 kB view details)

Uploaded CPython 3.10 macOS 10.9+ x86-64

asynq-1.6.0-cp39-cp39-win_amd64.whl (656.3 kB view details)

Uploaded CPython 3.9 Windows x86-64

asynq-1.6.0-cp39-cp39-win32.whl (590.6 kB view details)

Uploaded CPython 3.9 Windows x86

asynq-1.6.0-cp39-cp39-musllinux_1_2_x86_64.whl (3.6 MB view details)

Uploaded CPython 3.9 musllinux: musl 1.2+ x86-64

asynq-1.6.0-cp39-cp39-musllinux_1_2_i686.whl (3.5 MB view details)

Uploaded CPython 3.9 musllinux: musl 1.2+ i686

asynq-1.6.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (3.7 MB view details)

Uploaded CPython 3.9 manylinux: glibc 2.17+ x86-64

asynq-1.6.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl (3.5 MB view details)

Uploaded CPython 3.9 manylinux: glibc 2.17+ i686 manylinux: glibc 2.5+ i686

asynq-1.6.0-cp39-cp39-macosx_10_9_x86_64.whl (715.0 kB view details)

Uploaded CPython 3.9 macOS 10.9+ x86-64

File details

Details for the file asynq-1.6.0.tar.gz.

File metadata

  • Download URL: asynq-1.6.0.tar.gz
  • Upload date:
  • Size: 65.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.1.1 CPython/3.9.20

File hashes

Hashes for asynq-1.6.0.tar.gz
Algorithm Hash digest
SHA256 9d30cde5dbfa5fc5d8b0bbe14c8ffe2d54320ee0db8936fd47da53a2b296a22f
MD5 0cdcc7dc40f5a22eec23a46a33b3a286
BLAKE2b-256 13ac89fc0703363062e591e3eb1b1905c4d2613b98f11a9aa0ca919d65e5df15

See more details on using hashes here.

File details

Details for the file asynq-1.6.0-pp310-pypy310_pp73-win_amd64.whl.

File metadata

File hashes

Hashes for asynq-1.6.0-pp310-pypy310_pp73-win_amd64.whl
Algorithm Hash digest
SHA256 8af8046407d49d87b1a38b724a8c5cc6ceb216e7d92e8f013c08b10894a4c5e3
MD5 536584468fb0b6da2c114745a754971d
BLAKE2b-256 16cad8a1118a8f5cd4e2393673609f5e503646e27f32d1207c350c7009e5c420

See more details on using hashes here.

File details

Details for the file asynq-1.6.0-pp310-pypy310_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for asynq-1.6.0-pp310-pypy310_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 9093a542313aad2ce16b54a5440e003c036f2d6a4c04578c1befad20e6f88d43
MD5 d6c5cdff0645700fd80bc1244018664b
BLAKE2b-256 f111e2c4a91d804c4b772c2b377b1e3d59c16a9df1bd8ee49e4418521ef171c7

See more details on using hashes here.

File details

Details for the file asynq-1.6.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl.

File metadata

File hashes

Hashes for asynq-1.6.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 bd460af82f2bcf8f954dab7d76fed4b1bb6d87332a695362dfcef824858761e8
MD5 a40c8525d59ad62cc046e28eb5ffc1f4
BLAKE2b-256 ee5ace3b9326f2e6334d4a6dc1a0d9e2731f4efb08333d391ee160393cdd0c19

See more details on using hashes here.

File details

Details for the file asynq-1.6.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl.

File metadata

File hashes

Hashes for asynq-1.6.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 af2ee60be4cbe3e1c5f4e77466e2d1dbfa778dd254f66b911d656901ae3c3156
MD5 2ad8bfcdfbb5c45e052123b89335c987
BLAKE2b-256 273338bc60415f88e56e893de3800640d9aa1780f3b3c72ec300cf59bd3674ec

See more details on using hashes here.

File details

Details for the file asynq-1.6.0-pp39-pypy39_pp73-win_amd64.whl.

File metadata

File hashes

Hashes for asynq-1.6.0-pp39-pypy39_pp73-win_amd64.whl
Algorithm Hash digest
SHA256 32683f7b4a65b910325adf4cd02f35e5632724bdf58f47d14572bbb8b4bcc9dc
MD5 d59defce50841623de2bf750f53c3456
BLAKE2b-256 ab56144e1e21947add2430922c737aaab4e57eecac22a3bf47d55fb0bf2e986d

See more details on using hashes here.

File details

Details for the file asynq-1.6.0-pp39-pypy39_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for asynq-1.6.0-pp39-pypy39_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 610a10973ddbcb7f77d46c9958acea1148697b53b605e2669573820add43c870
MD5 9b34a8dd04a632ddcf3a7010bc9b106f
BLAKE2b-256 4c50e37def8b6a712a4206338b4bddae62be7362cb45a6e1ce533596f9b29da0

See more details on using hashes here.

File details

Details for the file asynq-1.6.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl.

File metadata

File hashes

Hashes for asynq-1.6.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 f772192e500bb14f4bee4ab8822617b65e05b9505b1b9fef4a3c62d09f63520d
MD5 a7d8809c0600875fa473cd738a1821ea
BLAKE2b-256 b62f0ae278910d9e8346e1c704c5644ac045d69d3781b4e25ee11ff146a17ba5

See more details on using hashes here.

File details

Details for the file asynq-1.6.0-pp39-pypy39_pp73-macosx_10_15_x86_64.whl.

File metadata

File hashes

Hashes for asynq-1.6.0-pp39-pypy39_pp73-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 b05b354d8a51f44ba4c6e6d1519f2d89effe7a50ba7c495fc8ddc3361c982e9c
MD5 7cd4f4e32cdd455b5cb8cfb36b630921
BLAKE2b-256 2bf3e62108910ba42d6f7afe05b88bb4ceb30e42ed092f9cfc9761036ff3b60a

See more details on using hashes here.

File details

Details for the file asynq-1.6.0-cp313-cp313-win_amd64.whl.

File metadata

  • Download URL: asynq-1.6.0-cp313-cp313-win_amd64.whl
  • Upload date:
  • Size: 636.3 kB
  • Tags: CPython 3.13, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.1.1 CPython/3.9.20

File hashes

Hashes for asynq-1.6.0-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 730f7c0cf23eb4826fdb4998481d99622167c9d895c278d84467bc15b3710615
MD5 16eca0e4e675961a61b4ed8fbef73f42
BLAKE2b-256 98f959dc82934c95d3b5ab4861001a20c58977a96eec85fb606df5137ffcb257

See more details on using hashes here.

File details

Details for the file asynq-1.6.0-cp313-cp313-win32.whl.

File metadata

  • Download URL: asynq-1.6.0-cp313-cp313-win32.whl
  • Upload date:
  • Size: 566.9 kB
  • Tags: CPython 3.13, Windows x86
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.1.1 CPython/3.9.20

File hashes

Hashes for asynq-1.6.0-cp313-cp313-win32.whl
Algorithm Hash digest
SHA256 299c1829a1747dcb58305dbc71191461004a28a48e780d471ace979343f3def8
MD5 40566921ee3888055ef2feec00194886
BLAKE2b-256 8bbfe993c4ccee91ac51119c8745708ef4e1ef30fea19cd157270083f259b6ea

See more details on using hashes here.

File details

Details for the file asynq-1.6.0-cp313-cp313-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for asynq-1.6.0-cp313-cp313-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 75996e16bc7ff912649453ed979352705b7349aa0435696e44c74c45aae83c82
MD5 00a31d8153184276964fcff373a2535f
BLAKE2b-256 e26ac4893f281b4dfdbe7600fce72f5a7d4c42bbf309c939dfbc70e09680593f

See more details on using hashes here.

File details

Details for the file asynq-1.6.0-cp313-cp313-musllinux_1_2_i686.whl.

File metadata

File hashes

Hashes for asynq-1.6.0-cp313-cp313-musllinux_1_2_i686.whl
Algorithm Hash digest
SHA256 0b245ecf71cdcf85406add84341d30f30f959a2e39a11d0afb981a84288d22f6
MD5 38bf8434dc5dfa22c41d98e0615169f5
BLAKE2b-256 b6f25c04add55d6512e705382f14752201470ec2730e2cd0725eed7607c034bd

See more details on using hashes here.

File details

Details for the file asynq-1.6.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for asynq-1.6.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 534f80beeb1839169e1084a1c07ff17883269f136e2fe5de7959cfb291e4db85
MD5 690d1adc17a10903b7a70a2af987ed75
BLAKE2b-256 11a7b09af5a9b111fcba31498d1ce634166e447e1e35e80badef3cd778b8f2ab

See more details on using hashes here.

File details

Details for the file asynq-1.6.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl.

File metadata

File hashes

Hashes for asynq-1.6.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 d03af78701fef8110f00ddc82d7385d66821d67e814b21f36f9e33359854f47f
MD5 af80702184467b7e5af13349c5775b5d
BLAKE2b-256 04a9869e8f32371651bcfe67137e1ec0232f1edea2f451862b1961bb56b558c5

See more details on using hashes here.

File details

Details for the file asynq-1.6.0-cp313-cp313-macosx_10_13_x86_64.whl.

File metadata

File hashes

Hashes for asynq-1.6.0-cp313-cp313-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 b45de0ab186ec31562c961e1aa6a16722671cdf215a990d30091e8baadb0f414
MD5 39c65eb16e7600a72c4e42f632d99e7d
BLAKE2b-256 27677f332985fed1a71a5c53d36c348f57515277a1f5f2f0d7286f064748ebb5

See more details on using hashes here.

File details

Details for the file asynq-1.6.0-cp312-cp312-win_amd64.whl.

File metadata

  • Download URL: asynq-1.6.0-cp312-cp312-win_amd64.whl
  • Upload date:
  • Size: 643.8 kB
  • Tags: CPython 3.12, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.1.1 CPython/3.9.20

File hashes

Hashes for asynq-1.6.0-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 7f6e5d691d5086d44c5216111281254fbf01f91937502f0994b165919e1a07b5
MD5 6b5956bfcfb262e11170ba2586f78490
BLAKE2b-256 84e144e4bbcb0b04271118ecac56c4c9db0ca65a5760b47f339cb7c4803df07a

See more details on using hashes here.

File details

Details for the file asynq-1.6.0-cp312-cp312-win32.whl.

File metadata

  • Download URL: asynq-1.6.0-cp312-cp312-win32.whl
  • Upload date:
  • Size: 572.0 kB
  • Tags: CPython 3.12, Windows x86
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.1.1 CPython/3.9.20

File hashes

Hashes for asynq-1.6.0-cp312-cp312-win32.whl
Algorithm Hash digest
SHA256 fa2c92ced5e4db2ec1413ea57fb71c10704b4986eb27cdf154a9bd3a11fccde5
MD5 883f11d21aa6413a1a832bb86fad6e24
BLAKE2b-256 07e147191a022da08b3afa6b527d7ea9cd34dbe06906c166b12c1ba6029b2c26

See more details on using hashes here.

File details

Details for the file asynq-1.6.0-cp312-cp312-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for asynq-1.6.0-cp312-cp312-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 4c64fb28ee6c712e6b73434af63af611c1725767b223c5a78bed32ee1c076103
MD5 ba451347a73c32f1792491879e61ac35
BLAKE2b-256 5e7b216b20b1e7993661262d4bf1ac0834274908435938c473b90240eb8dc0cb

See more details on using hashes here.

File details

Details for the file asynq-1.6.0-cp312-cp312-musllinux_1_2_i686.whl.

File metadata

File hashes

Hashes for asynq-1.6.0-cp312-cp312-musllinux_1_2_i686.whl
Algorithm Hash digest
SHA256 4aca4ea828c7445fbf695e1b65798cb6b08ebaa7e53ba21fc0681992345fe3d2
MD5 7b2eec4e4d4d97290dbb29f3b4ba3fe9
BLAKE2b-256 9beaa8aab7c494a8a4190fa5960d4d3d3707878ff633019f2fc0720899193ba0

See more details on using hashes here.

File details

Details for the file asynq-1.6.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for asynq-1.6.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 2e54ec34d7983d1493e4e786c8a9de37efbf73d6b87f5fce2373b05bb3d73853
MD5 4b952e113775a0c73f467f87a5e7311f
BLAKE2b-256 1bd2190d7afe5a6a63f0397d2651aeed8e35b972288da7379885c4819296eb25

See more details on using hashes here.

File details

Details for the file asynq-1.6.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl.

File metadata

File hashes

Hashes for asynq-1.6.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 23ac3e292ba1e774541b764f1003da15b8be2e11cc970e370052e3326e43090b
MD5 3acc2aa2d00a66015165dc3ad8a0c1d2
BLAKE2b-256 e66f00f56d7f6430f3497b6a8bf1b626468f7dc265de6f56cf6b5ba81f65456a

See more details on using hashes here.

File details

Details for the file asynq-1.6.0-cp312-cp312-macosx_10_13_x86_64.whl.

File metadata

File hashes

Hashes for asynq-1.6.0-cp312-cp312-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 e7fb47403fb05dda9cd54f055b1b5065e17c5768ffe7b787fb0206c4086d4b68
MD5 e075c225b10139872d97cb6244e09dce
BLAKE2b-256 cf9877726a172bc7f004b244c5819b0c719d6979d9c0232d8b833dc74dd016f2

See more details on using hashes here.

File details

Details for the file asynq-1.6.0-cp311-cp311-win_amd64.whl.

File metadata

  • Download URL: asynq-1.6.0-cp311-cp311-win_amd64.whl
  • Upload date:
  • Size: 655.0 kB
  • Tags: CPython 3.11, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.1.1 CPython/3.9.20

File hashes

Hashes for asynq-1.6.0-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 6f1656d719e4ff1e14b3763e1df8768e2f22b3231552a3cc96cec1e295bf99c9
MD5 59626e6a107136fd90b536d379c018dc
BLAKE2b-256 1a4fb054ee3e4f6198b29f2b9f05403575d113225e7041c8bcf9707ee7a4d2e2

See more details on using hashes here.

File details

Details for the file asynq-1.6.0-cp311-cp311-win32.whl.

File metadata

  • Download URL: asynq-1.6.0-cp311-cp311-win32.whl
  • Upload date:
  • Size: 585.7 kB
  • Tags: CPython 3.11, Windows x86
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.1.1 CPython/3.9.20

File hashes

Hashes for asynq-1.6.0-cp311-cp311-win32.whl
Algorithm Hash digest
SHA256 e96bbea2f85825936bb84cb23ad741e9a90b67b32eb032511cd4121d84f8082b
MD5 99b497fcd7fbe14ef6ece5b3c665f66f
BLAKE2b-256 b235ea78df05140641d2268c27473964869d0713e613cccb168d0b8aee899a08

See more details on using hashes here.

File details

Details for the file asynq-1.6.0-cp311-cp311-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for asynq-1.6.0-cp311-cp311-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 acc3e944cfeea459c2de97931af144954cebba4062702228090f9a58a25186bc
MD5 231dce7d99402f85b4d9b5284684e86a
BLAKE2b-256 33de2c4113f5357e26427b29b87490115930682ec19d026ae9ce2ed9c961e709

See more details on using hashes here.

File details

Details for the file asynq-1.6.0-cp311-cp311-musllinux_1_2_i686.whl.

File metadata

File hashes

Hashes for asynq-1.6.0-cp311-cp311-musllinux_1_2_i686.whl
Algorithm Hash digest
SHA256 c28963942bada5f145ec4f65da4e2c5b28ae85d7a77a287ede21f159d83acdb4
MD5 da23afd5e4045a9bcbef48ad806a555c
BLAKE2b-256 ce79b08e95465f8744584c3eabb3fcef982d84b58c00a817f1dea873ded12c29

See more details on using hashes here.

File details

Details for the file asynq-1.6.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for asynq-1.6.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 10ecf43f0bb3f7c39bcdb560ce4e2bad9f08855ea1e718023a521921619fc524
MD5 faf534d9a4fb677cb8d4060b879ca12b
BLAKE2b-256 03c0b8358695e4c02f3280d28f7099f126afc81c3b86d9ea1b1eb529d5537e6d

See more details on using hashes here.

File details

Details for the file asynq-1.6.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl.

File metadata

File hashes

Hashes for asynq-1.6.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 124dc9215eb9058c7a44965ccc7e8a4c67000ae4b78127e89a8479890e1a966f
MD5 745a51c4ab61d9527a067d3eeb640fb6
BLAKE2b-256 7c6b81f641704212545c27c6d0b204cc88c1417bf7e14117b14d309f24dc1f4f

See more details on using hashes here.

File details

Details for the file asynq-1.6.0-cp311-cp311-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for asynq-1.6.0-cp311-cp311-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 e62e3857dff2d0503853956a13d3fb42cda1d6d0cce06998c142006cb396efbe
MD5 cd1284de47fe58af6464845b01dfd990
BLAKE2b-256 8a9ab64924d1aaf0281f6f955437ab672d9fcfc802ed40e29072b566f0983048

See more details on using hashes here.

File details

Details for the file asynq-1.6.0-cp310-cp310-win_amd64.whl.

File metadata

  • Download URL: asynq-1.6.0-cp310-cp310-win_amd64.whl
  • Upload date:
  • Size: 652.7 kB
  • Tags: CPython 3.10, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.1.1 CPython/3.9.20

File hashes

Hashes for asynq-1.6.0-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 c08f0fc1b85a7a3ce6921c7eeb8a3d85c7aca65e2d03063a1af315dd3e202fdc
MD5 41637bd614410f4ff93b1ad832bfd47f
BLAKE2b-256 93bb2a206c15e6ad3364131cd868ac4c158369ed5b2eaa9636973dfe921ed36a

See more details on using hashes here.

File details

Details for the file asynq-1.6.0-cp310-cp310-win32.whl.

File metadata

  • Download URL: asynq-1.6.0-cp310-cp310-win32.whl
  • Upload date:
  • Size: 587.0 kB
  • Tags: CPython 3.10, Windows x86
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.1.1 CPython/3.9.20

File hashes

Hashes for asynq-1.6.0-cp310-cp310-win32.whl
Algorithm Hash digest
SHA256 756ee36e2c6547b58822028858595b66aca9a0a9163165d4b526b37182279274
MD5 245c586283451c7356df4919f69e67d7
BLAKE2b-256 9cbb147419609d3aa4db9c85c2844c3685828dfcd6cfd65cd91c410fa584f6bd

See more details on using hashes here.

File details

Details for the file asynq-1.6.0-cp310-cp310-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for asynq-1.6.0-cp310-cp310-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 193be10639c18497bc5bc361bd2bc75f3c3c8c6984f76d6f8dfb4106dfc3234f
MD5 088b213975b938e6d4027e835eabb3b4
BLAKE2b-256 a337fcc38dd24e3f9064a06a16228410b5e2d27c8ef52abca2e61c530eca4879

See more details on using hashes here.

File details

Details for the file asynq-1.6.0-cp310-cp310-musllinux_1_2_i686.whl.

File metadata

File hashes

Hashes for asynq-1.6.0-cp310-cp310-musllinux_1_2_i686.whl
Algorithm Hash digest
SHA256 97c3cca777618ba5360f253a0d1d289ef8b2186117fb8f31f1aad03aafc4067f
MD5 631ba85ed57d6dcface52297de157eff
BLAKE2b-256 03cf401749310817af312be42d1843ee745cc79747771b071896e01dc7b8dcd7

See more details on using hashes here.

File details

Details for the file asynq-1.6.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for asynq-1.6.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 f2c52d498bcdc66ff142b071bfde10e5a75e313fcae05652b17c29652b8349a5
MD5 f38aa4c131fbf0c2d1a2699e2e2a5592
BLAKE2b-256 3cb577ca1e4e521889cd73960fc6cddfef5f22d09f05154d3e5fe03315564408

See more details on using hashes here.

File details

Details for the file asynq-1.6.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl.

File metadata

File hashes

Hashes for asynq-1.6.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 5c840ebc07e1c351d969fbe4dedaf9d7fe38146501e087c3e353e05241b9942d
MD5 60e9b2c33f85211a02cd3a4d599f8537
BLAKE2b-256 d449fc4ea89860df61088ea65f84d4e147b65790290ef11b62563ae35444cdd5

See more details on using hashes here.

File details

Details for the file asynq-1.6.0-cp310-cp310-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for asynq-1.6.0-cp310-cp310-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 998eace188522a5ee8bd9ebed75dc05dcb7cfd4d076935b568f3ab83eb53bd99
MD5 93e67217addcdde50723afcd69367e1e
BLAKE2b-256 410030ffa96659b85596bbd11c10a51e3a44ae8ebda8758e6cf2c3403e077429

See more details on using hashes here.

File details

Details for the file asynq-1.6.0-cp39-cp39-win_amd64.whl.

File metadata

  • Download URL: asynq-1.6.0-cp39-cp39-win_amd64.whl
  • Upload date:
  • Size: 656.3 kB
  • Tags: CPython 3.9, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.1.1 CPython/3.9.20

File hashes

Hashes for asynq-1.6.0-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 780f7158aa5d11a4f6a9a14977c00ae7dd40c1ac7e831a8af251ac443a3d2c2e
MD5 5c96c2f3352d5a0128069fcab22190d8
BLAKE2b-256 86ddfc39166b27faf5e2fd6539adf72238fc2f1201ad8e099d8a26f71e62e607

See more details on using hashes here.

File details

Details for the file asynq-1.6.0-cp39-cp39-win32.whl.

File metadata

  • Download URL: asynq-1.6.0-cp39-cp39-win32.whl
  • Upload date:
  • Size: 590.6 kB
  • Tags: CPython 3.9, Windows x86
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.1.1 CPython/3.9.20

File hashes

Hashes for asynq-1.6.0-cp39-cp39-win32.whl
Algorithm Hash digest
SHA256 c986be03d5278b03a7c042086aca96de44e0d7889c80d506d44d24224cac6ef4
MD5 50ffd6b139ec3b482cf3df48a5bfef50
BLAKE2b-256 8274fe6ba706679e3cfb7efd4e112b3a8f813ee5cd4f264657fb7ff7d1e9b27f

See more details on using hashes here.

File details

Details for the file asynq-1.6.0-cp39-cp39-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for asynq-1.6.0-cp39-cp39-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 e03fe9da34d593ee091608e56d17a1a5034618cbb0b576980e971519ec75880d
MD5 2de7bc99f01c2fa519e1dce22d5fc828
BLAKE2b-256 0e361f1b22a9a99b09e37e1fada39dea67c53b1ae45d7ad480f0ba602343a6db

See more details on using hashes here.

File details

Details for the file asynq-1.6.0-cp39-cp39-musllinux_1_2_i686.whl.

File metadata

File hashes

Hashes for asynq-1.6.0-cp39-cp39-musllinux_1_2_i686.whl
Algorithm Hash digest
SHA256 aaf947d26e0b0b4de006f1d42e96eb5648bc8398c4ed2f935ab2775aa23f8603
MD5 860d1aee6f5d0e6f34f66a582db081cf
BLAKE2b-256 1b81b43d38aeacec51e673704eeca34b4e2d539640f63714764bb3e33431168e

See more details on using hashes here.

File details

Details for the file asynq-1.6.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for asynq-1.6.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 0c855fe83ec96ad54b1bc3b123cff63eb5bc334afa1b7a7c6fdd117c6c718fd6
MD5 c3652956d237884c8c723a94219c16fc
BLAKE2b-256 a13646ae34140545377f1280eecc2697139a4631cce9cf3807b3dded98a3257b

See more details on using hashes here.

File details

Details for the file asynq-1.6.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl.

File metadata

File hashes

Hashes for asynq-1.6.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 fc2a12d7b915571272e6e3ff2c202fedb12108ee45de60e364b3fe140cae1413
MD5 cc25ade1faa946c24eb5055eaf171367
BLAKE2b-256 0ec00fb3b9dc474f6cfae09bf95a8ddce8a6ecd783eebac17fd84f6681942be3

See more details on using hashes here.

File details

Details for the file asynq-1.6.0-cp39-cp39-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for asynq-1.6.0-cp39-cp39-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 f369151371573a716e898890bcb2cf099e39c6e47e7ed9b8649890bae6836d1b
MD5 cdd5d81b5d59b56506901434a85b553c
BLAKE2b-256 6e888b7a29a664eccda6fddeb99ef11fc53679442f7102275ff7cd725e5aa2b5

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page