.. image:: 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 <https://www.quora.com/q/quoraengineering/Asynchronous-Programming-in-Python>`_.
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:
.. code-block:: python
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:
.. code-block:: python
@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:
.. code-block:: python
result = async_fn(a, b)
and asynchronously like this:
.. code-block:: python
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:
.. code-block:: python
@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:
.. code-block:: python
@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:
.. code-block:: python
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 <https://github.com/alexyakunin>`_, `Jelle Zijlstra <https://github.com/JelleZijlstra>`_, `Manan Nayak <https://github.com/manannayak>`_, `Martin Michelsen <https://github.com/fuzziqersoftware>`_, `Shrey Banga <https://github.com/banga>`_, `Suren Nihalani <https://github.com/snihalani>`_, `Suchir Balaji <https://github.com/suchir>`_ and
other engineers at Quora.
Raw data
{
"_id": null,
"home_page": "https://github.com/quora/asynq",
"name": "asynq",
"maintainer": null,
"docs_url": null,
"requires_python": ">=3.9",
"maintainer_email": null,
"keywords": "quora asynq common utility",
"author": "Quora, Inc.",
"author_email": "asynq@quora.com",
"download_url": "https://files.pythonhosted.org/packages/13/ac/89fc0703363062e591e3eb1b1905c4d2613b98f11a9aa0ca919d65e5df15/asynq-1.6.0.tar.gz",
"platform": null,
"description": ".. image:: http://i.imgur.com/jCPNyOa.png\n\n``asynq`` is a library for asynchronous programming in Python with a focus on batching requests to\nexternal services. It also provides seamless interoperability with synchronous code, support for\nasynchronous context managers, and tools to make writing and testing asynchronous code easier.\n``asynq`` was developed at Quora and is a core component of Quora's architecture. See the original blog\npost `here <https://www.quora.com/q/quoraengineering/Asynchronous-Programming-in-Python>`_.\n\nThe most important use case for ``asynq`` is batching. For many storage services (e.g., memcache,\nredis) it is far faster to make a single request that fetches many keys at once than to make\nmany requests that each fetch a single key. The ``asynq`` framework makes it easy to write code\nthat takes advantage of batching without radical changes in code structure from code that does not\nuse batching.\n\nFor example, synchronous code to retrieve the names of the authors of a list of Quora answers may\nlook like this:\n\n.. code-block:: python\n\n def all_author_names(aids):\n uids = [author_of_answer(aid) for aid in aids]\n names = [name_of_user(uid) for uid in uids]\n return names\n\nHere, each call to ``author_of_answer`` and ``name_of_user`` would result in a memcache request.\nConverted to use ``asynq``, this code would look like:\n\n.. code-block:: python\n\n @asynq()\n def all_author_names(aids):\n uids = yield [author_of_answer.asynq(aid) for aid in aids]\n names = yield [name_of_user.asynq(uid) for uid in uids]\n return names\n\nAll ``author_of_answer`` calls will be combined into a single memcache request, as will all of the\n``name_of_user`` calls.\n\nFutures\n-------\n\nFutures are the basic building blocks of ``asynq``'s programming model. The scheduler keeps track\nof futures and attempts to schedule them in an efficient way. ``asynq`` uses its own hierarchy of\nFuture classes, rooted in ``asynq.FutureBase``. Futures have a ``.value()`` method that computes\ntheir value if necessary and then returns it.\n\nThe following are the most important Future classes used in ``asynq``:\n\n- ``AsyncTask``, a Future representing the execution of an asynchronous function (see below).\n Normally created by calling ``.asynq()`` on an asynchronous function.\n- ``ConstFuture``, a Future whose value is known at creation time. This is useful when you need\n to pass a Future somewhere, but no computation is actually needed.\n- ``BatchBase`` and ``BatchItemBase``, the building blocks for doing batching. See below for\n details.\n\n\nDecorators and asynchronous functions\n-------------------------------------\n\n``asynq``'s asynchronous functions are implemented as Python generator functions. Every time an\nasynchronous functions yields one or more Futures, it cedes control the asynq scheduler, which will\nresolve the futures that were yielded and continue running the function after the futures have been\ncomputed.\n\nThe framework requires usage of the ``@asynq()`` decorator on all asynchronous functions. This\ndecorator wraps the generator function so that it can be called like a normal, synchronous function.\nIt also creates a ``.asynq`` attribute on the function that allows calling the function\nasynchronously. Calling this attribute will return an ``AsyncTask`` object corresponding to the\nfunction.\n\nYou can call an asynchronous function synchronously like this:\n\n.. code-block:: python\n\n result = async_fn(a, b)\n\nand asynchronously like this:\n\n.. code-block:: python\n\n result = yield async_fn.asynq(a, b)\n\nCalling ``async_fn.asynq(a, b).value()`` has the same result as ``async_fn(a, b)``.\n\nThe decorator has a ``pure=True`` option that disables the ``.asynq`` attribute and instead makes\nthe function itself asynchronous, so that calling it returns an ``AsyncTask``. We recommend to use\nthis option only in special cases like decorators for asynchronous functions.\n\n``asynq`` also provides an ``@async_proxy()`` decorator for functions that return a Future\ndirectly. Functions decorated with ``@async_proxy()`` look like ``@asynq()`` functions externally.\nAn example use case is a function that takes either an asynchronous or a synchronous function,\nand calls it accordingly:\n\n.. code-block:: python\n\n @async_proxy()\n def async_call(fn, *args, **kwargs):\n if is_async_fn(fn):\n # Returns an AsyncTask\n return fn.asynq(*args, **kwargs)\n return ConstFuture(fn(*args, **kwargs))\n\nBatching\n--------\n\nBatching is at the core of what makes ``asynq`` useful. To implement batching, you need to subclass\n``asynq.BatchItemBase`` and ``asynq.BatchBase``. The first represents a single entry in a batch\n(e.g., a single memcache key to fetch) and the second is responsible for executing the batch when\nthe scheduler requests it.\n\nBatch items usually do not require much logic beyond registering themselves with the currently\nactive batch in ``__init__``. Batches need to override the ``_try_switch_active_batch`` method,\nwhich changes the batch that is currently active, and the ``_flush`` method that executes it.\nThis method should call ``.set_value()`` on all the items in the batch.\n\nAn example implementation of batching for memcache is in the ``asynq/examples/batching.py`` file.\nThe framework also provides a ``DebugBatchItem`` for testing.\n\nMost users of ``asynq`` should not need to implement batches frequently. At Quora, we use\nthousands of asynchronous functions, but only five ``BatchBase`` subclasses.\n\nContexts\n--------\n\n``asynq`` provides support for Python context managers that are automatically activated and\ndeactivated when a particular task is scheduled. This feature is necessary because the scheduler\ncan schedule tasks in arbitrary order. For example, consider the following code:\n\n.. code-block:: python\n\n @asynq()\n def show_warning():\n yield do_something_that_creates_a_warning.asynq()\n\n @asynq()\n def suppress_warning():\n with warnings.catch_warnings():\n yield show_warning.asynq()\n\n @asynq()\n def caller():\n yield show_warning.asynq(), suppress_warning.asynq()\n\nThis code should show only one warning, because only the second call to ``show_warning`` is within\na ``catch_warnings()`` context, but depending on how the scheduler happens to execute these\nfunctions, the code that shows the warning may also be executed while ``catch_warnings()`` is\nactive.\n\nTo remedy this problem, you should use an ``AsyncContext``, which will be automatically paused when\nthe task that created it is no longer active and resumed when it becomes active again. An\n``asynq``-compatible version of ``catch_warnings`` would look something like this:\n\n.. code-block:: python\n\n class catch_warnings(asynq.AsyncContext):\n def pause(self):\n stop_catching_warnings()\n\n def resume(self):\n start_catching_warnings()\n\nDebugging\n---------\n\nBecause the ``asynq`` scheduler is invoked every time an asynchronous function is called, and it\ncan invoke arbitrary other active futures, normal Python stack traces become useless in a\nsufficiently complicated application built on ``asynq``. To make debugging easier, the framework\nprovides the ability to generate a custom ``asynq`` stack trace, which shows how each active\nasynchronous function was invoked.\n\nThe ``asynq.debug.dump_asynq_stack()`` method can be used to print this stack, similar to\n``traceback.print_stack()``. The framework also registers a hook to print out the ``asynq`` stack\nwhen an exception happens.\n\nTools\n-----\n\n``asynq`` provides a number of additional tools to make it easier to write asynchronous code. Some\nof these are in the ``asynq.tools`` module. These tools include:\n\n- ``asynq.async_call`` calls a function asynchronously only if it is asynchronous. This can be\n useful when calling an overridden method that is asynchronous on some child classes but not on others.\n- ``asynq.tools.call_with_context`` calls an asynchronous function within the provided context\n manager. This is helpful in cases where you need to yield multiple tasks at once, but only one\n needs to be within the context.\n- ``asynq.tools.afilter`` and ``asynq.tools.asorted`` are equivalents of the standard ``filter``\n and ``sorted`` functions that take asynchronous functions as their filter and compare functions.\n- ``asynq.tools.acached_per_instance`` caches an asynchronous instance method.\n- ``asynq.tools.deduplicate`` prevents multiple simultaneous calls to the same asynchronous\n function.\n- The ``asynq.mock`` module is an enhancement to the standard ``mock`` module that makes it\n painless to mock asynchronous functions. Without this module, mocking any asynchronous function\n will often also require mocking its ``.asynq`` attribute. We recommend using ``asynq.mock.patch``\n for all mocking in projects that use ``asynq``.\n- The ``asynq.generator`` module provides an experimental implementation of asynchronous\n generators, which can produce a sequence of values while also using ``asynq``'s batching support.\n\nCompatibility\n-------------\n\n``asynq`` runs on Python 3.8 and newer.\n\nPrevious versions of ``asynq`` used the name ``async`` for the ``@asynq()`` decorator and the\n``.asynq`` attribute. Because ``async`` is a keyword in recent versions of Python 3, we now use\nthe spelling ``asynq`` in both places. ``asynq`` version 1.3.0 drops support for the old spelling.\n\nContributors\n------------\n\n`Alex Yakunin <https://github.com/alexyakunin>`_, `Jelle Zijlstra <https://github.com/JelleZijlstra>`_, `Manan Nayak <https://github.com/manannayak>`_, `Martin Michelsen <https://github.com/fuzziqersoftware>`_, `Shrey Banga <https://github.com/banga>`_, `Suren Nihalani <https://github.com/snihalani>`_, `Suchir Balaji <https://github.com/suchir>`_ and\nother engineers at Quora.\n",
"bugtrack_url": null,
"license": "Apache Software License",
"summary": "Quora's asynq library",
"version": "1.6.0",
"project_urls": {
"Homepage": "https://github.com/quora/asynq"
},
"split_keywords": [
"quora",
"asynq",
"common",
"utility"
],
"urls": [
{
"comment_text": "",
"digests": {
"blake2b_256": "410030ffa96659b85596bbd11c10a51e3a44ae8ebda8758e6cf2c3403e077429",
"md5": "93e67217addcdde50723afcd69367e1e",
"sha256": "998eace188522a5ee8bd9ebed75dc05dcb7cfd4d076935b568f3ab83eb53bd99"
},
"downloads": -1,
"filename": "asynq-1.6.0-cp310-cp310-macosx_10_9_x86_64.whl",
"has_sig": false,
"md5_digest": "93e67217addcdde50723afcd69367e1e",
"packagetype": "bdist_wheel",
"python_version": "cp310",
"requires_python": ">=3.9",
"size": 710698,
"upload_time": "2024-10-11T22:49:13",
"upload_time_iso_8601": "2024-10-11T22:49:13.281154Z",
"url": "https://files.pythonhosted.org/packages/41/00/30ffa96659b85596bbd11c10a51e3a44ae8ebda8758e6cf2c3403e077429/asynq-1.6.0-cp310-cp310-macosx_10_9_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "3cb577ca1e4e521889cd73960fc6cddfef5f22d09f05154d3e5fe03315564408",
"md5": "f38aa4c131fbf0c2d1a2699e2e2a5592",
"sha256": "f2c52d498bcdc66ff142b071bfde10e5a75e313fcae05652b17c29652b8349a5"
},
"downloads": -1,
"filename": "asynq-1.6.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"has_sig": false,
"md5_digest": "f38aa4c131fbf0c2d1a2699e2e2a5592",
"packagetype": "bdist_wheel",
"python_version": "cp310",
"requires_python": ">=3.9",
"size": 3659187,
"upload_time": "2024-10-11T22:49:15",
"upload_time_iso_8601": "2024-10-11T22:49:15.410816Z",
"url": "https://files.pythonhosted.org/packages/3c/b5/77ca1e4e521889cd73960fc6cddfef5f22d09f05154d3e5fe03315564408/asynq-1.6.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "d449fc4ea89860df61088ea65f84d4e147b65790290ef11b62563ae35444cdd5",
"md5": "60e9b2c33f85211a02cd3a4d599f8537",
"sha256": "5c840ebc07e1c351d969fbe4dedaf9d7fe38146501e087c3e353e05241b9942d"
},
"downloads": -1,
"filename": "asynq-1.6.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl",
"has_sig": false,
"md5_digest": "60e9b2c33f85211a02cd3a4d599f8537",
"packagetype": "bdist_wheel",
"python_version": "cp310",
"requires_python": ">=3.9",
"size": 3483824,
"upload_time": "2024-10-11T22:49:17",
"upload_time_iso_8601": "2024-10-11T22:49:17.533319Z",
"url": "https://files.pythonhosted.org/packages/d4/49/fc4ea89860df61088ea65f84d4e147b65790290ef11b62563ae35444cdd5/asynq-1.6.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "03cf401749310817af312be42d1843ee745cc79747771b071896e01dc7b8dcd7",
"md5": "631ba85ed57d6dcface52297de157eff",
"sha256": "97c3cca777618ba5360f253a0d1d289ef8b2186117fb8f31f1aad03aafc4067f"
},
"downloads": -1,
"filename": "asynq-1.6.0-cp310-cp310-musllinux_1_2_i686.whl",
"has_sig": false,
"md5_digest": "631ba85ed57d6dcface52297de157eff",
"packagetype": "bdist_wheel",
"python_version": "cp310",
"requires_python": ">=3.9",
"size": 3448217,
"upload_time": "2024-10-11T22:49:19",
"upload_time_iso_8601": "2024-10-11T22:49:19.808714Z",
"url": "https://files.pythonhosted.org/packages/03/cf/401749310817af312be42d1843ee745cc79747771b071896e01dc7b8dcd7/asynq-1.6.0-cp310-cp310-musllinux_1_2_i686.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "a337fcc38dd24e3f9064a06a16228410b5e2d27c8ef52abca2e61c530eca4879",
"md5": "088b213975b938e6d4027e835eabb3b4",
"sha256": "193be10639c18497bc5bc361bd2bc75f3c3c8c6984f76d6f8dfb4106dfc3234f"
},
"downloads": -1,
"filename": "asynq-1.6.0-cp310-cp310-musllinux_1_2_x86_64.whl",
"has_sig": false,
"md5_digest": "088b213975b938e6d4027e835eabb3b4",
"packagetype": "bdist_wheel",
"python_version": "cp310",
"requires_python": ">=3.9",
"size": 3565999,
"upload_time": "2024-10-11T22:49:21",
"upload_time_iso_8601": "2024-10-11T22:49:21.430061Z",
"url": "https://files.pythonhosted.org/packages/a3/37/fcc38dd24e3f9064a06a16228410b5e2d27c8ef52abca2e61c530eca4879/asynq-1.6.0-cp310-cp310-musllinux_1_2_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "9cbb147419609d3aa4db9c85c2844c3685828dfcd6cfd65cd91c410fa584f6bd",
"md5": "245c586283451c7356df4919f69e67d7",
"sha256": "756ee36e2c6547b58822028858595b66aca9a0a9163165d4b526b37182279274"
},
"downloads": -1,
"filename": "asynq-1.6.0-cp310-cp310-win32.whl",
"has_sig": false,
"md5_digest": "245c586283451c7356df4919f69e67d7",
"packagetype": "bdist_wheel",
"python_version": "cp310",
"requires_python": ">=3.9",
"size": 586985,
"upload_time": "2024-10-11T22:49:22",
"upload_time_iso_8601": "2024-10-11T22:49:22.740005Z",
"url": "https://files.pythonhosted.org/packages/9c/bb/147419609d3aa4db9c85c2844c3685828dfcd6cfd65cd91c410fa584f6bd/asynq-1.6.0-cp310-cp310-win32.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "93bb2a206c15e6ad3364131cd868ac4c158369ed5b2eaa9636973dfe921ed36a",
"md5": "41637bd614410f4ff93b1ad832bfd47f",
"sha256": "c08f0fc1b85a7a3ce6921c7eeb8a3d85c7aca65e2d03063a1af315dd3e202fdc"
},
"downloads": -1,
"filename": "asynq-1.6.0-cp310-cp310-win_amd64.whl",
"has_sig": false,
"md5_digest": "41637bd614410f4ff93b1ad832bfd47f",
"packagetype": "bdist_wheel",
"python_version": "cp310",
"requires_python": ">=3.9",
"size": 652748,
"upload_time": "2024-10-11T22:49:24",
"upload_time_iso_8601": "2024-10-11T22:49:24.062418Z",
"url": "https://files.pythonhosted.org/packages/93/bb/2a206c15e6ad3364131cd868ac4c158369ed5b2eaa9636973dfe921ed36a/asynq-1.6.0-cp310-cp310-win_amd64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "8a9ab64924d1aaf0281f6f955437ab672d9fcfc802ed40e29072b566f0983048",
"md5": "cd1284de47fe58af6464845b01dfd990",
"sha256": "e62e3857dff2d0503853956a13d3fb42cda1d6d0cce06998c142006cb396efbe"
},
"downloads": -1,
"filename": "asynq-1.6.0-cp311-cp311-macosx_10_9_x86_64.whl",
"has_sig": false,
"md5_digest": "cd1284de47fe58af6464845b01dfd990",
"packagetype": "bdist_wheel",
"python_version": "cp311",
"requires_python": ">=3.9",
"size": 713700,
"upload_time": "2024-10-11T22:49:25",
"upload_time_iso_8601": "2024-10-11T22:49:25.305340Z",
"url": "https://files.pythonhosted.org/packages/8a/9a/b64924d1aaf0281f6f955437ab672d9fcfc802ed40e29072b566f0983048/asynq-1.6.0-cp311-cp311-macosx_10_9_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "03c0b8358695e4c02f3280d28f7099f126afc81c3b86d9ea1b1eb529d5537e6d",
"md5": "faf534d9a4fb677cb8d4060b879ca12b",
"sha256": "10ecf43f0bb3f7c39bcdb560ce4e2bad9f08855ea1e718023a521921619fc524"
},
"downloads": -1,
"filename": "asynq-1.6.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"has_sig": false,
"md5_digest": "faf534d9a4fb677cb8d4060b879ca12b",
"packagetype": "bdist_wheel",
"python_version": "cp311",
"requires_python": ">=3.9",
"size": 3992630,
"upload_time": "2024-10-11T22:49:26",
"upload_time_iso_8601": "2024-10-11T22:49:26.788093Z",
"url": "https://files.pythonhosted.org/packages/03/c0/b8358695e4c02f3280d28f7099f126afc81c3b86d9ea1b1eb529d5537e6d/asynq-1.6.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "7c6b81f641704212545c27c6d0b204cc88c1417bf7e14117b14d309f24dc1f4f",
"md5": "745a51c4ab61d9527a067d3eeb640fb6",
"sha256": "124dc9215eb9058c7a44965ccc7e8a4c67000ae4b78127e89a8479890e1a966f"
},
"downloads": -1,
"filename": "asynq-1.6.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl",
"has_sig": false,
"md5_digest": "745a51c4ab61d9527a067d3eeb640fb6",
"packagetype": "bdist_wheel",
"python_version": "cp311",
"requires_python": ">=3.9",
"size": 3800484,
"upload_time": "2024-10-11T22:49:28",
"upload_time_iso_8601": "2024-10-11T22:49:28.225347Z",
"url": "https://files.pythonhosted.org/packages/7c/6b/81f641704212545c27c6d0b204cc88c1417bf7e14117b14d309f24dc1f4f/asynq-1.6.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "ce79b08e95465f8744584c3eabb3fcef982d84b58c00a817f1dea873ded12c29",
"md5": "da23afd5e4045a9bcbef48ad806a555c",
"sha256": "c28963942bada5f145ec4f65da4e2c5b28ae85d7a77a287ede21f159d83acdb4"
},
"downloads": -1,
"filename": "asynq-1.6.0-cp311-cp311-musllinux_1_2_i686.whl",
"has_sig": false,
"md5_digest": "da23afd5e4045a9bcbef48ad806a555c",
"packagetype": "bdist_wheel",
"python_version": "cp311",
"requires_python": ">=3.9",
"size": 3834228,
"upload_time": "2024-10-11T22:49:29",
"upload_time_iso_8601": "2024-10-11T22:49:29.688407Z",
"url": "https://files.pythonhosted.org/packages/ce/79/b08e95465f8744584c3eabb3fcef982d84b58c00a817f1dea873ded12c29/asynq-1.6.0-cp311-cp311-musllinux_1_2_i686.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "33de2c4113f5357e26427b29b87490115930682ec19d026ae9ce2ed9c961e709",
"md5": "231dce7d99402f85b4d9b5284684e86a",
"sha256": "acc3e944cfeea459c2de97931af144954cebba4062702228090f9a58a25186bc"
},
"downloads": -1,
"filename": "asynq-1.6.0-cp311-cp311-musllinux_1_2_x86_64.whl",
"has_sig": false,
"md5_digest": "231dce7d99402f85b4d9b5284684e86a",
"packagetype": "bdist_wheel",
"python_version": "cp311",
"requires_python": ">=3.9",
"size": 3925809,
"upload_time": "2024-10-11T22:49:31",
"upload_time_iso_8601": "2024-10-11T22:49:31.796835Z",
"url": "https://files.pythonhosted.org/packages/33/de/2c4113f5357e26427b29b87490115930682ec19d026ae9ce2ed9c961e709/asynq-1.6.0-cp311-cp311-musllinux_1_2_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "b235ea78df05140641d2268c27473964869d0713e613cccb168d0b8aee899a08",
"md5": "99b497fcd7fbe14ef6ece5b3c665f66f",
"sha256": "e96bbea2f85825936bb84cb23ad741e9a90b67b32eb032511cd4121d84f8082b"
},
"downloads": -1,
"filename": "asynq-1.6.0-cp311-cp311-win32.whl",
"has_sig": false,
"md5_digest": "99b497fcd7fbe14ef6ece5b3c665f66f",
"packagetype": "bdist_wheel",
"python_version": "cp311",
"requires_python": ">=3.9",
"size": 585683,
"upload_time": "2024-10-11T22:49:33",
"upload_time_iso_8601": "2024-10-11T22:49:33.907543Z",
"url": "https://files.pythonhosted.org/packages/b2/35/ea78df05140641d2268c27473964869d0713e613cccb168d0b8aee899a08/asynq-1.6.0-cp311-cp311-win32.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "1a4fb054ee3e4f6198b29f2b9f05403575d113225e7041c8bcf9707ee7a4d2e2",
"md5": "59626e6a107136fd90b536d379c018dc",
"sha256": "6f1656d719e4ff1e14b3763e1df8768e2f22b3231552a3cc96cec1e295bf99c9"
},
"downloads": -1,
"filename": "asynq-1.6.0-cp311-cp311-win_amd64.whl",
"has_sig": false,
"md5_digest": "59626e6a107136fd90b536d379c018dc",
"packagetype": "bdist_wheel",
"python_version": "cp311",
"requires_python": ">=3.9",
"size": 655050,
"upload_time": "2024-10-11T22:49:35",
"upload_time_iso_8601": "2024-10-11T22:49:35.050134Z",
"url": "https://files.pythonhosted.org/packages/1a/4f/b054ee3e4f6198b29f2b9f05403575d113225e7041c8bcf9707ee7a4d2e2/asynq-1.6.0-cp311-cp311-win_amd64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "cf9877726a172bc7f004b244c5819b0c719d6979d9c0232d8b833dc74dd016f2",
"md5": "e075c225b10139872d97cb6244e09dce",
"sha256": "e7fb47403fb05dda9cd54f055b1b5065e17c5768ffe7b787fb0206c4086d4b68"
},
"downloads": -1,
"filename": "asynq-1.6.0-cp312-cp312-macosx_10_13_x86_64.whl",
"has_sig": false,
"md5_digest": "e075c225b10139872d97cb6244e09dce",
"packagetype": "bdist_wheel",
"python_version": "cp312",
"requires_python": ">=3.9",
"size": 711469,
"upload_time": "2024-10-11T22:49:36",
"upload_time_iso_8601": "2024-10-11T22:49:36.953614Z",
"url": "https://files.pythonhosted.org/packages/cf/98/77726a172bc7f004b244c5819b0c719d6979d9c0232d8b833dc74dd016f2/asynq-1.6.0-cp312-cp312-macosx_10_13_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "1bd2190d7afe5a6a63f0397d2651aeed8e35b972288da7379885c4819296eb25",
"md5": "4b952e113775a0c73f467f87a5e7311f",
"sha256": "2e54ec34d7983d1493e4e786c8a9de37efbf73d6b87f5fce2373b05bb3d73853"
},
"downloads": -1,
"filename": "asynq-1.6.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"has_sig": false,
"md5_digest": "4b952e113775a0c73f467f87a5e7311f",
"packagetype": "bdist_wheel",
"python_version": "cp312",
"requires_python": ">=3.9",
"size": 3971582,
"upload_time": "2024-10-11T22:49:38",
"upload_time_iso_8601": "2024-10-11T22:49:38.476876Z",
"url": "https://files.pythonhosted.org/packages/1b/d2/190d7afe5a6a63f0397d2651aeed8e35b972288da7379885c4819296eb25/asynq-1.6.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "e66f00f56d7f6430f3497b6a8bf1b626468f7dc265de6f56cf6b5ba81f65456a",
"md5": "3acc2aa2d00a66015165dc3ad8a0c1d2",
"sha256": "23ac3e292ba1e774541b764f1003da15b8be2e11cc970e370052e3326e43090b"
},
"downloads": -1,
"filename": "asynq-1.6.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl",
"has_sig": false,
"md5_digest": "3acc2aa2d00a66015165dc3ad8a0c1d2",
"packagetype": "bdist_wheel",
"python_version": "cp312",
"requires_python": ">=3.9",
"size": 3739095,
"upload_time": "2024-10-11T22:49:40",
"upload_time_iso_8601": "2024-10-11T22:49:40.555198Z",
"url": "https://files.pythonhosted.org/packages/e6/6f/00f56d7f6430f3497b6a8bf1b626468f7dc265de6f56cf6b5ba81f65456a/asynq-1.6.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "9beaa8aab7c494a8a4190fa5960d4d3d3707878ff633019f2fc0720899193ba0",
"md5": "7b2eec4e4d4d97290dbb29f3b4ba3fe9",
"sha256": "4aca4ea828c7445fbf695e1b65798cb6b08ebaa7e53ba21fc0681992345fe3d2"
},
"downloads": -1,
"filename": "asynq-1.6.0-cp312-cp312-musllinux_1_2_i686.whl",
"has_sig": false,
"md5_digest": "7b2eec4e4d4d97290dbb29f3b4ba3fe9",
"packagetype": "bdist_wheel",
"python_version": "cp312",
"requires_python": ">=3.9",
"size": 3764319,
"upload_time": "2024-10-11T22:49:42",
"upload_time_iso_8601": "2024-10-11T22:49:42.664154Z",
"url": "https://files.pythonhosted.org/packages/9b/ea/a8aab7c494a8a4190fa5960d4d3d3707878ff633019f2fc0720899193ba0/asynq-1.6.0-cp312-cp312-musllinux_1_2_i686.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "5e7b216b20b1e7993661262d4bf1ac0834274908435938c473b90240eb8dc0cb",
"md5": "ba451347a73c32f1792491879e61ac35",
"sha256": "4c64fb28ee6c712e6b73434af63af611c1725767b223c5a78bed32ee1c076103"
},
"downloads": -1,
"filename": "asynq-1.6.0-cp312-cp312-musllinux_1_2_x86_64.whl",
"has_sig": false,
"md5_digest": "ba451347a73c32f1792491879e61ac35",
"packagetype": "bdist_wheel",
"python_version": "cp312",
"requires_python": ">=3.9",
"size": 3884938,
"upload_time": "2024-10-11T22:49:44",
"upload_time_iso_8601": "2024-10-11T22:49:44.203283Z",
"url": "https://files.pythonhosted.org/packages/5e/7b/216b20b1e7993661262d4bf1ac0834274908435938c473b90240eb8dc0cb/asynq-1.6.0-cp312-cp312-musllinux_1_2_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "07e147191a022da08b3afa6b527d7ea9cd34dbe06906c166b12c1ba6029b2c26",
"md5": "883f11d21aa6413a1a832bb86fad6e24",
"sha256": "fa2c92ced5e4db2ec1413ea57fb71c10704b4986eb27cdf154a9bd3a11fccde5"
},
"downloads": -1,
"filename": "asynq-1.6.0-cp312-cp312-win32.whl",
"has_sig": false,
"md5_digest": "883f11d21aa6413a1a832bb86fad6e24",
"packagetype": "bdist_wheel",
"python_version": "cp312",
"requires_python": ">=3.9",
"size": 572025,
"upload_time": "2024-10-11T22:49:45",
"upload_time_iso_8601": "2024-10-11T22:49:45.504206Z",
"url": "https://files.pythonhosted.org/packages/07/e1/47191a022da08b3afa6b527d7ea9cd34dbe06906c166b12c1ba6029b2c26/asynq-1.6.0-cp312-cp312-win32.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "84e144e4bbcb0b04271118ecac56c4c9db0ca65a5760b47f339cb7c4803df07a",
"md5": "6b5956bfcfb262e11170ba2586f78490",
"sha256": "7f6e5d691d5086d44c5216111281254fbf01f91937502f0994b165919e1a07b5"
},
"downloads": -1,
"filename": "asynq-1.6.0-cp312-cp312-win_amd64.whl",
"has_sig": false,
"md5_digest": "6b5956bfcfb262e11170ba2586f78490",
"packagetype": "bdist_wheel",
"python_version": "cp312",
"requires_python": ">=3.9",
"size": 643755,
"upload_time": "2024-10-11T22:49:47",
"upload_time_iso_8601": "2024-10-11T22:49:47.472330Z",
"url": "https://files.pythonhosted.org/packages/84/e1/44e4bbcb0b04271118ecac56c4c9db0ca65a5760b47f339cb7c4803df07a/asynq-1.6.0-cp312-cp312-win_amd64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "27677f332985fed1a71a5c53d36c348f57515277a1f5f2f0d7286f064748ebb5",
"md5": "39c65eb16e7600a72c4e42f632d99e7d",
"sha256": "b45de0ab186ec31562c961e1aa6a16722671cdf215a990d30091e8baadb0f414"
},
"downloads": -1,
"filename": "asynq-1.6.0-cp313-cp313-macosx_10_13_x86_64.whl",
"has_sig": false,
"md5_digest": "39c65eb16e7600a72c4e42f632d99e7d",
"packagetype": "bdist_wheel",
"python_version": "cp313",
"requires_python": ">=3.9",
"size": 697274,
"upload_time": "2024-10-11T22:49:49",
"upload_time_iso_8601": "2024-10-11T22:49:49.350715Z",
"url": "https://files.pythonhosted.org/packages/27/67/7f332985fed1a71a5c53d36c348f57515277a1f5f2f0d7286f064748ebb5/asynq-1.6.0-cp313-cp313-macosx_10_13_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "11a7b09af5a9b111fcba31498d1ce634166e447e1e35e80badef3cd778b8f2ab",
"md5": "690d1adc17a10903b7a70a2af987ed75",
"sha256": "534f80beeb1839169e1084a1c07ff17883269f136e2fe5de7959cfb291e4db85"
},
"downloads": -1,
"filename": "asynq-1.6.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"has_sig": false,
"md5_digest": "690d1adc17a10903b7a70a2af987ed75",
"packagetype": "bdist_wheel",
"python_version": "cp313",
"requires_python": ">=3.9",
"size": 3905409,
"upload_time": "2024-10-11T22:49:51",
"upload_time_iso_8601": "2024-10-11T22:49:51.887106Z",
"url": "https://files.pythonhosted.org/packages/11/a7/b09af5a9b111fcba31498d1ce634166e447e1e35e80badef3cd778b8f2ab/asynq-1.6.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "04a9869e8f32371651bcfe67137e1ec0232f1edea2f451862b1961bb56b558c5",
"md5": "af80702184467b7e5af13349c5775b5d",
"sha256": "d03af78701fef8110f00ddc82d7385d66821d67e814b21f36f9e33359854f47f"
},
"downloads": -1,
"filename": "asynq-1.6.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl",
"has_sig": false,
"md5_digest": "af80702184467b7e5af13349c5775b5d",
"packagetype": "bdist_wheel",
"python_version": "cp313",
"requires_python": ">=3.9",
"size": 3680141,
"upload_time": "2024-10-11T22:49:54",
"upload_time_iso_8601": "2024-10-11T22:49:54.541734Z",
"url": "https://files.pythonhosted.org/packages/04/a9/869e8f32371651bcfe67137e1ec0232f1edea2f451862b1961bb56b558c5/asynq-1.6.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "b6f25c04add55d6512e705382f14752201470ec2730e2cd0725eed7607c034bd",
"md5": "38bf8434dc5dfa22c41d98e0615169f5",
"sha256": "0b245ecf71cdcf85406add84341d30f30f959a2e39a11d0afb981a84288d22f6"
},
"downloads": -1,
"filename": "asynq-1.6.0-cp313-cp313-musllinux_1_2_i686.whl",
"has_sig": false,
"md5_digest": "38bf8434dc5dfa22c41d98e0615169f5",
"packagetype": "bdist_wheel",
"python_version": "cp313",
"requires_python": ">=3.9",
"size": 3682543,
"upload_time": "2024-10-11T22:49:57",
"upload_time_iso_8601": "2024-10-11T22:49:57.345656Z",
"url": "https://files.pythonhosted.org/packages/b6/f2/5c04add55d6512e705382f14752201470ec2730e2cd0725eed7607c034bd/asynq-1.6.0-cp313-cp313-musllinux_1_2_i686.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "e26ac4893f281b4dfdbe7600fce72f5a7d4c42bbf309c939dfbc70e09680593f",
"md5": "00a31d8153184276964fcff373a2535f",
"sha256": "75996e16bc7ff912649453ed979352705b7349aa0435696e44c74c45aae83c82"
},
"downloads": -1,
"filename": "asynq-1.6.0-cp313-cp313-musllinux_1_2_x86_64.whl",
"has_sig": false,
"md5_digest": "00a31d8153184276964fcff373a2535f",
"packagetype": "bdist_wheel",
"python_version": "cp313",
"requires_python": ">=3.9",
"size": 3837740,
"upload_time": "2024-10-11T22:49:59",
"upload_time_iso_8601": "2024-10-11T22:49:59.541878Z",
"url": "https://files.pythonhosted.org/packages/e2/6a/c4893f281b4dfdbe7600fce72f5a7d4c42bbf309c939dfbc70e09680593f/asynq-1.6.0-cp313-cp313-musllinux_1_2_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "8bbfe993c4ccee91ac51119c8745708ef4e1ef30fea19cd157270083f259b6ea",
"md5": "40566921ee3888055ef2feec00194886",
"sha256": "299c1829a1747dcb58305dbc71191461004a28a48e780d471ace979343f3def8"
},
"downloads": -1,
"filename": "asynq-1.6.0-cp313-cp313-win32.whl",
"has_sig": false,
"md5_digest": "40566921ee3888055ef2feec00194886",
"packagetype": "bdist_wheel",
"python_version": "cp313",
"requires_python": ">=3.9",
"size": 566897,
"upload_time": "2024-10-11T22:50:01",
"upload_time_iso_8601": "2024-10-11T22:50:01.162846Z",
"url": "https://files.pythonhosted.org/packages/8b/bf/e993c4ccee91ac51119c8745708ef4e1ef30fea19cd157270083f259b6ea/asynq-1.6.0-cp313-cp313-win32.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "98f959dc82934c95d3b5ab4861001a20c58977a96eec85fb606df5137ffcb257",
"md5": "16eca0e4e675961a61b4ed8fbef73f42",
"sha256": "730f7c0cf23eb4826fdb4998481d99622167c9d895c278d84467bc15b3710615"
},
"downloads": -1,
"filename": "asynq-1.6.0-cp313-cp313-win_amd64.whl",
"has_sig": false,
"md5_digest": "16eca0e4e675961a61b4ed8fbef73f42",
"packagetype": "bdist_wheel",
"python_version": "cp313",
"requires_python": ">=3.9",
"size": 636342,
"upload_time": "2024-10-11T22:50:02",
"upload_time_iso_8601": "2024-10-11T22:50:02.314804Z",
"url": "https://files.pythonhosted.org/packages/98/f9/59dc82934c95d3b5ab4861001a20c58977a96eec85fb606df5137ffcb257/asynq-1.6.0-cp313-cp313-win_amd64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "6e888b7a29a664eccda6fddeb99ef11fc53679442f7102275ff7cd725e5aa2b5",
"md5": "cdd5d81b5d59b56506901434a85b553c",
"sha256": "f369151371573a716e898890bcb2cf099e39c6e47e7ed9b8649890bae6836d1b"
},
"downloads": -1,
"filename": "asynq-1.6.0-cp39-cp39-macosx_10_9_x86_64.whl",
"has_sig": false,
"md5_digest": "cdd5d81b5d59b56506901434a85b553c",
"packagetype": "bdist_wheel",
"python_version": "cp39",
"requires_python": ">=3.9",
"size": 715005,
"upload_time": "2024-10-11T22:50:03",
"upload_time_iso_8601": "2024-10-11T22:50:03.728245Z",
"url": "https://files.pythonhosted.org/packages/6e/88/8b7a29a664eccda6fddeb99ef11fc53679442f7102275ff7cd725e5aa2b5/asynq-1.6.0-cp39-cp39-macosx_10_9_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "a13646ae34140545377f1280eecc2697139a4631cce9cf3807b3dded98a3257b",
"md5": "c3652956d237884c8c723a94219c16fc",
"sha256": "0c855fe83ec96ad54b1bc3b123cff63eb5bc334afa1b7a7c6fdd117c6c718fd6"
},
"downloads": -1,
"filename": "asynq-1.6.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"has_sig": false,
"md5_digest": "c3652956d237884c8c723a94219c16fc",
"packagetype": "bdist_wheel",
"python_version": "cp39",
"requires_python": ">=3.9",
"size": 3676188,
"upload_time": "2024-10-11T22:50:04",
"upload_time_iso_8601": "2024-10-11T22:50:04.984868Z",
"url": "https://files.pythonhosted.org/packages/a1/36/46ae34140545377f1280eecc2697139a4631cce9cf3807b3dded98a3257b/asynq-1.6.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "0ec00fb3b9dc474f6cfae09bf95a8ddce8a6ecd783eebac17fd84f6681942be3",
"md5": "cc25ade1faa946c24eb5055eaf171367",
"sha256": "fc2a12d7b915571272e6e3ff2c202fedb12108ee45de60e364b3fe140cae1413"
},
"downloads": -1,
"filename": "asynq-1.6.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl",
"has_sig": false,
"md5_digest": "cc25ade1faa946c24eb5055eaf171367",
"packagetype": "bdist_wheel",
"python_version": "cp39",
"requires_python": ">=3.9",
"size": 3500169,
"upload_time": "2024-10-11T22:50:07",
"upload_time_iso_8601": "2024-10-11T22:50:07.253414Z",
"url": "https://files.pythonhosted.org/packages/0e/c0/0fb3b9dc474f6cfae09bf95a8ddce8a6ecd783eebac17fd84f6681942be3/asynq-1.6.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "1b81b43d38aeacec51e673704eeca34b4e2d539640f63714764bb3e33431168e",
"md5": "860d1aee6f5d0e6f34f66a582db081cf",
"sha256": "aaf947d26e0b0b4de006f1d42e96eb5648bc8398c4ed2f935ab2775aa23f8603"
},
"downloads": -1,
"filename": "asynq-1.6.0-cp39-cp39-musllinux_1_2_i686.whl",
"has_sig": false,
"md5_digest": "860d1aee6f5d0e6f34f66a582db081cf",
"packagetype": "bdist_wheel",
"python_version": "cp39",
"requires_python": ">=3.9",
"size": 3466393,
"upload_time": "2024-10-11T22:50:08",
"upload_time_iso_8601": "2024-10-11T22:50:08.871997Z",
"url": "https://files.pythonhosted.org/packages/1b/81/b43d38aeacec51e673704eeca34b4e2d539640f63714764bb3e33431168e/asynq-1.6.0-cp39-cp39-musllinux_1_2_i686.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "0e361f1b22a9a99b09e37e1fada39dea67c53b1ae45d7ad480f0ba602343a6db",
"md5": "2de7bc99f01c2fa519e1dce22d5fc828",
"sha256": "e03fe9da34d593ee091608e56d17a1a5034618cbb0b576980e971519ec75880d"
},
"downloads": -1,
"filename": "asynq-1.6.0-cp39-cp39-musllinux_1_2_x86_64.whl",
"has_sig": false,
"md5_digest": "2de7bc99f01c2fa519e1dce22d5fc828",
"packagetype": "bdist_wheel",
"python_version": "cp39",
"requires_python": ">=3.9",
"size": 3574017,
"upload_time": "2024-10-11T22:50:10",
"upload_time_iso_8601": "2024-10-11T22:50:10.253831Z",
"url": "https://files.pythonhosted.org/packages/0e/36/1f1b22a9a99b09e37e1fada39dea67c53b1ae45d7ad480f0ba602343a6db/asynq-1.6.0-cp39-cp39-musllinux_1_2_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "8274fe6ba706679e3cfb7efd4e112b3a8f813ee5cd4f264657fb7ff7d1e9b27f",
"md5": "50ffd6b139ec3b482cf3df48a5bfef50",
"sha256": "c986be03d5278b03a7c042086aca96de44e0d7889c80d506d44d24224cac6ef4"
},
"downloads": -1,
"filename": "asynq-1.6.0-cp39-cp39-win32.whl",
"has_sig": false,
"md5_digest": "50ffd6b139ec3b482cf3df48a5bfef50",
"packagetype": "bdist_wheel",
"python_version": "cp39",
"requires_python": ">=3.9",
"size": 590640,
"upload_time": "2024-10-11T22:50:12",
"upload_time_iso_8601": "2024-10-11T22:50:12.513643Z",
"url": "https://files.pythonhosted.org/packages/82/74/fe6ba706679e3cfb7efd4e112b3a8f813ee5cd4f264657fb7ff7d1e9b27f/asynq-1.6.0-cp39-cp39-win32.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "86ddfc39166b27faf5e2fd6539adf72238fc2f1201ad8e099d8a26f71e62e607",
"md5": "5c96c2f3352d5a0128069fcab22190d8",
"sha256": "780f7158aa5d11a4f6a9a14977c00ae7dd40c1ac7e831a8af251ac443a3d2c2e"
},
"downloads": -1,
"filename": "asynq-1.6.0-cp39-cp39-win_amd64.whl",
"has_sig": false,
"md5_digest": "5c96c2f3352d5a0128069fcab22190d8",
"packagetype": "bdist_wheel",
"python_version": "cp39",
"requires_python": ">=3.9",
"size": 656291,
"upload_time": "2024-10-11T22:50:13",
"upload_time_iso_8601": "2024-10-11T22:50:13.643701Z",
"url": "https://files.pythonhosted.org/packages/86/dd/fc39166b27faf5e2fd6539adf72238fc2f1201ad8e099d8a26f71e62e607/asynq-1.6.0-cp39-cp39-win_amd64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "273338bc60415f88e56e893de3800640d9aa1780f3b3c72ec300cf59bd3674ec",
"md5": "2ad8bfcdfbb5c45e052123b89335c987",
"sha256": "af2ee60be4cbe3e1c5f4e77466e2d1dbfa778dd254f66b911d656901ae3c3156"
},
"downloads": -1,
"filename": "asynq-1.6.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl",
"has_sig": false,
"md5_digest": "2ad8bfcdfbb5c45e052123b89335c987",
"packagetype": "bdist_wheel",
"python_version": "pp310",
"requires_python": ">=3.9",
"size": 572232,
"upload_time": "2024-10-11T22:50:14",
"upload_time_iso_8601": "2024-10-11T22:50:14.937979Z",
"url": "https://files.pythonhosted.org/packages/27/33/38bc60415f88e56e893de3800640d9aa1780f3b3c72ec300cf59bd3674ec/asynq-1.6.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "ee5ace3b9326f2e6334d4a6dc1a0d9e2731f4efb08333d391ee160393cdd0c19",
"md5": "a40c8525d59ad62cc046e28eb5ffc1f4",
"sha256": "bd460af82f2bcf8f954dab7d76fed4b1bb6d87332a695362dfcef824858761e8"
},
"downloads": -1,
"filename": "asynq-1.6.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl",
"has_sig": false,
"md5_digest": "a40c8525d59ad62cc046e28eb5ffc1f4",
"packagetype": "bdist_wheel",
"python_version": "pp310",
"requires_python": ">=3.9",
"size": 686529,
"upload_time": "2024-10-11T22:50:16",
"upload_time_iso_8601": "2024-10-11T22:50:16.327070Z",
"url": "https://files.pythonhosted.org/packages/ee/5a/ce3b9326f2e6334d4a6dc1a0d9e2731f4efb08333d391ee160393cdd0c19/asynq-1.6.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "f111e2c4a91d804c4b772c2b377b1e3d59c16a9df1bd8ee49e4418521ef171c7",
"md5": "d6c5cdff0645700fd80bc1244018664b",
"sha256": "9093a542313aad2ce16b54a5440e003c036f2d6a4c04578c1befad20e6f88d43"
},
"downloads": -1,
"filename": "asynq-1.6.0-pp310-pypy310_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"has_sig": false,
"md5_digest": "d6c5cdff0645700fd80bc1244018664b",
"packagetype": "bdist_wheel",
"python_version": "pp310",
"requires_python": ">=3.9",
"size": 675663,
"upload_time": "2024-10-11T22:50:17",
"upload_time_iso_8601": "2024-10-11T22:50:17.798125Z",
"url": "https://files.pythonhosted.org/packages/f1/11/e2c4a91d804c4b772c2b377b1e3d59c16a9df1bd8ee49e4418521ef171c7/asynq-1.6.0-pp310-pypy310_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "16cad8a1118a8f5cd4e2393673609f5e503646e27f32d1207c350c7009e5c420",
"md5": "536584468fb0b6da2c114745a754971d",
"sha256": "8af8046407d49d87b1a38b724a8c5cc6ceb216e7d92e8f013c08b10894a4c5e3"
},
"downloads": -1,
"filename": "asynq-1.6.0-pp310-pypy310_pp73-win_amd64.whl",
"has_sig": false,
"md5_digest": "536584468fb0b6da2c114745a754971d",
"packagetype": "bdist_wheel",
"python_version": "pp310",
"requires_python": ">=3.9",
"size": 579644,
"upload_time": "2024-10-11T22:50:19",
"upload_time_iso_8601": "2024-10-11T22:50:19.759888Z",
"url": "https://files.pythonhosted.org/packages/16/ca/d8a1118a8f5cd4e2393673609f5e503646e27f32d1207c350c7009e5c420/asynq-1.6.0-pp310-pypy310_pp73-win_amd64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "2bf3e62108910ba42d6f7afe05b88bb4ceb30e42ed092f9cfc9761036ff3b60a",
"md5": "7cd4f4e32cdd455b5cb8cfb36b630921",
"sha256": "b05b354d8a51f44ba4c6e6d1519f2d89effe7a50ba7c495fc8ddc3361c982e9c"
},
"downloads": -1,
"filename": "asynq-1.6.0-pp39-pypy39_pp73-macosx_10_15_x86_64.whl",
"has_sig": false,
"md5_digest": "7cd4f4e32cdd455b5cb8cfb36b630921",
"packagetype": "bdist_wheel",
"python_version": "pp39",
"requires_python": ">=3.9",
"size": 571237,
"upload_time": "2024-10-11T22:50:20",
"upload_time_iso_8601": "2024-10-11T22:50:20.890967Z",
"url": "https://files.pythonhosted.org/packages/2b/f3/e62108910ba42d6f7afe05b88bb4ceb30e42ed092f9cfc9761036ff3b60a/asynq-1.6.0-pp39-pypy39_pp73-macosx_10_15_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "b62f0ae278910d9e8346e1c704c5644ac045d69d3781b4e25ee11ff146a17ba5",
"md5": "a7d8809c0600875fa473cd738a1821ea",
"sha256": "f772192e500bb14f4bee4ab8822617b65e05b9505b1b9fef4a3c62d09f63520d"
},
"downloads": -1,
"filename": "asynq-1.6.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl",
"has_sig": false,
"md5_digest": "a7d8809c0600875fa473cd738a1821ea",
"packagetype": "bdist_wheel",
"python_version": "pp39",
"requires_python": ">=3.9",
"size": 685383,
"upload_time": "2024-10-11T22:50:22",
"upload_time_iso_8601": "2024-10-11T22:50:22.048532Z",
"url": "https://files.pythonhosted.org/packages/b6/2f/0ae278910d9e8346e1c704c5644ac045d69d3781b4e25ee11ff146a17ba5/asynq-1.6.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "4c50e37def8b6a712a4206338b4bddae62be7362cb45a6e1ce533596f9b29da0",
"md5": "9b34a8dd04a632ddcf3a7010bc9b106f",
"sha256": "610a10973ddbcb7f77d46c9958acea1148697b53b605e2669573820add43c870"
},
"downloads": -1,
"filename": "asynq-1.6.0-pp39-pypy39_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"has_sig": false,
"md5_digest": "9b34a8dd04a632ddcf3a7010bc9b106f",
"packagetype": "bdist_wheel",
"python_version": "pp39",
"requires_python": ">=3.9",
"size": 674214,
"upload_time": "2024-10-11T22:50:23",
"upload_time_iso_8601": "2024-10-11T22:50:23.279258Z",
"url": "https://files.pythonhosted.org/packages/4c/50/e37def8b6a712a4206338b4bddae62be7362cb45a6e1ce533596f9b29da0/asynq-1.6.0-pp39-pypy39_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "ab56144e1e21947add2430922c737aaab4e57eecac22a3bf47d55fb0bf2e986d",
"md5": "d59defce50841623de2bf750f53c3456",
"sha256": "32683f7b4a65b910325adf4cd02f35e5632724bdf58f47d14572bbb8b4bcc9dc"
},
"downloads": -1,
"filename": "asynq-1.6.0-pp39-pypy39_pp73-win_amd64.whl",
"has_sig": false,
"md5_digest": "d59defce50841623de2bf750f53c3456",
"packagetype": "bdist_wheel",
"python_version": "pp39",
"requires_python": ">=3.9",
"size": 578607,
"upload_time": "2024-10-11T22:50:24",
"upload_time_iso_8601": "2024-10-11T22:50:24.481641Z",
"url": "https://files.pythonhosted.org/packages/ab/56/144e1e21947add2430922c737aaab4e57eecac22a3bf47d55fb0bf2e986d/asynq-1.6.0-pp39-pypy39_pp73-win_amd64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "13ac89fc0703363062e591e3eb1b1905c4d2613b98f11a9aa0ca919d65e5df15",
"md5": "0cdcc7dc40f5a22eec23a46a33b3a286",
"sha256": "9d30cde5dbfa5fc5d8b0bbe14c8ffe2d54320ee0db8936fd47da53a2b296a22f"
},
"downloads": -1,
"filename": "asynq-1.6.0.tar.gz",
"has_sig": false,
"md5_digest": "0cdcc7dc40f5a22eec23a46a33b3a286",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.9",
"size": 65946,
"upload_time": "2024-10-11T22:50:25",
"upload_time_iso_8601": "2024-10-11T22:50:25.621556Z",
"url": "https://files.pythonhosted.org/packages/13/ac/89fc0703363062e591e3eb1b1905c4d2613b98f11a9aa0ca919d65e5df15/asynq-1.6.0.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2024-10-11 22:50:25",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "quora",
"github_project": "asynq",
"travis_ci": false,
"coveralls": false,
"github_actions": true,
"requirements": [],
"tox": true,
"lcname": "asynq"
}