threaded


Namethreaded JSON
Version 4.2.0 PyPI version JSON
download
home_pagehttps://github.com/python-useful-helpers/threaded
SummaryDecorators for running functions in Thread/ThreadPool/IOLoop
upload_time2023-11-22 15:41:31
maintainer
docs_urlNone
author
requires_python>=3.8.0
licenseApache-2.0
keywords pooling multithreading threading asyncio development
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            threaded
========

.. image:: https://github.com/python-useful-helpers/threaded/workflows/Python%20package/badge.svg
    :target: https://github.com/python-useful-helpers/threaded/actions
.. image:: https://coveralls.io/repos/github/python-useful-helpers/threaded/badge.svg?branch=master
    :target: https://coveralls.io/github/python-useful-helpers/threaded?branch=master
.. image:: https://readthedocs.org/projects/threaded/badge/?version=latest
    :target: https://threaded.readthedocs.io/
    :alt: Documentation Status
.. image:: https://img.shields.io/pypi/v/threaded.svg
    :target: https://pypi.python.org/pypi/threaded
.. image:: https://img.shields.io/pypi/pyversions/threaded.svg
    :target: https://pypi.python.org/pypi/threaded
.. image:: https://img.shields.io/pypi/status/threaded.svg
    :target: https://pypi.python.org/pypi/threaded
.. image:: https://img.shields.io/github/license/python-useful-helpers/threaded.svg
    :target: https://raw.githubusercontent.com/python-useful-helpers/threaded/master/LICENSE
.. image:: https://img.shields.io/badge/code%20style-black-000000.svg
    :target: https://github.com/ambv/black

threaded is a set of decorators, which wrap functions in:

  * `concurrent.futures.ThreadPool`
  * `threading.Thread`
  * `asyncio.Task` in Python 3.

Why? Because copy-paste of `loop.create_task`, `threading.Thread` and `thread_pool.submit` is boring,
especially if target functions is used by this way only.

Pros:

* Free software: Apache license
* Open Source: https://github.com/python-useful-helpers/threaded
* PyPI packaged: https://pypi.python.org/pypi/threaded
* Tested: see bages on top

Decorators:

* `ThreadPooled` - native ``concurrent.futures.ThreadPool``.
* `threadpooled` is alias for `ThreadPooled`.

* `Threaded` - wrap in ``threading.Thread``.
* `threaded` is alias for `Threaded`.

* `AsyncIOTask` - wrap in ``asyncio.Task``. Uses the same API, as `ThreadPooled`.
* `asynciotask` is alias for `AsyncIOTask`.

Usage
=====

ThreadPooled
------------
Mostly it is required decorator: submit function to ThreadPoolExecutor on call.

.. code-block:: python

    threaded.ThreadPooled.configure(max_workers=3)

.. note::

    By default, if executor is not configured - it configures with default parameters: ``max_workers=CPU_COUNT * 5``

.. code-block:: python

    @threaded.ThreadPooled
    def func():
        pass

    concurrent.futures.wait([func()])

Usage with asyncio:

.. note::

    if `loop_getter` is not callable, `loop_getter_need_context` is ignored.

.. code-block:: python

    loop = asyncio.get_event_loop()
    @threaded.ThreadPooled(loop_getter=loop, loop_getter_need_context=False)
    def func():
        pass

    loop.run_until_complete(asyncio.wait_for(func(), timeout))

Python 3.5+ usage with asyncio and loop extraction from call arguments:

.. code-block:: python

    loop_getter = lambda tgt_loop: tgt_loop
    @threaded.ThreadPooled(loop_getter=loop_getter, loop_getter_need_context=True)  # loop_getter_need_context is required
    def func(*args, **kwargs):
        pass

    loop = asyncio.get_event_loop()
    loop.run_until_complete(asyncio.wait_for(func(loop), timeout))

During application shutdown, pool can be stopped (while it will be recreated automatically, if some component will request).

.. code-block:: python

    threaded.ThreadPooled.shutdown()

Threaded
--------
Classic ``threading.Thread``. Useful for running until close and self-closing threads without return.

Usage example:

.. code-block:: python

    @threaded.Threaded
    def func(*args, **kwargs):
        pass

    thread = func()
    thread.start()
    thread.join()

Without arguments, thread name will use pattern: ``'Threaded: ' + func.__name__``

.. note::

    If func.__name__ is not accessible, str(hash(func)) will be used instead.

Override name can be don via corresponding argument:

.. code-block:: python

    @threaded.Threaded(name='Function in thread')
    def func(*args, **kwargs):
        pass

Thread can be daemonized automatically:

.. code-block:: python

    @threaded.Threaded(daemon=True)
    def func(*args, **kwargs):
        pass

Also, if no any addition manipulations expected before thread start,
it can be started automatically before return:

.. code-block:: python

    @threaded.Threaded(started=True)
    def func(*args, **kwargs):
        pass

AsyncIOTask
-----------
Wrap in ``asyncio.Task``.

usage with asyncio:

.. code-block:: python

    @threaded.AsyncIOTask
    def func():
        pass

    loop = asyncio.get_event_loop()
    loop.run_until_complete(asyncio.wait_for(func(), timeout))

Provide event loop directly:

.. note::

    if `loop_getter` is not callable, `loop_getter_need_context` is ignored.

.. code-block:: python

    loop = asyncio.get_event_loop()
    @threaded.AsyncIOTask(loop_getter=loop)
    def func():
        pass

    loop.run_until_complete(asyncio.wait_for(func(), timeout))

Usage with loop extraction from call arguments:

.. code-block:: python

    loop_getter = lambda tgt_loop: tgt_loop
    @threaded.AsyncIOTask(loop_getter=loop_getter, loop_getter_need_context=True)
    def func(*args, **kwargs):
        pass

    loop = asyncio.get_event_loop()
    loop.run_until_complete(asyncio.wait_for(func(loop), timeout))

Testing
=======
The main test mechanism for the package `threaded` is using `tox`.
Available environments can be collected via `tox -l`

CI systems
==========
For code checking several CI systems is used in parallel:

2. `GitHub actions: <https://github.com/python-useful-helpers/threaded/actions>`_ is used for checking: PEP8, pylint, bandit, installation possibility and unit tests.
3. `coveralls: <https://coveralls.io/github/python-useful-helpers/threaded>`_ is used for coverage display.

CD system
=========
`GitHub actions: <https://github.com/python-useful-helpers/threaded/actions>`_ is used for package delivery on PyPI.

            

Raw data

            {
    "_id": null,
    "home_page": "https://github.com/python-useful-helpers/threaded",
    "name": "threaded",
    "maintainer": "",
    "docs_url": null,
    "requires_python": ">=3.8.0",
    "maintainer_email": "Aleksei Stepanov <penguinolog@gmail.com>, Antonio Esposito <esposito.cloud@gmail.com>, Dennis Dmitriev <dis-xcom@gmail.com>",
    "keywords": "pooling,multithreading,threading,asyncio,development",
    "author": "",
    "author_email": "Aleksei Stepanov <penguinolog@gmail.com>",
    "download_url": "https://files.pythonhosted.org/packages/78/a4/a89571c3e6c50dfc2087c33680775e66582c6a795237af4d264a63c78d15/threaded-4.2.0.tar.gz",
    "platform": null,
    "description": "threaded\n========\n\n.. image:: https://github.com/python-useful-helpers/threaded/workflows/Python%20package/badge.svg\n    :target: https://github.com/python-useful-helpers/threaded/actions\n.. image:: https://coveralls.io/repos/github/python-useful-helpers/threaded/badge.svg?branch=master\n    :target: https://coveralls.io/github/python-useful-helpers/threaded?branch=master\n.. image:: https://readthedocs.org/projects/threaded/badge/?version=latest\n    :target: https://threaded.readthedocs.io/\n    :alt: Documentation Status\n.. image:: https://img.shields.io/pypi/v/threaded.svg\n    :target: https://pypi.python.org/pypi/threaded\n.. image:: https://img.shields.io/pypi/pyversions/threaded.svg\n    :target: https://pypi.python.org/pypi/threaded\n.. image:: https://img.shields.io/pypi/status/threaded.svg\n    :target: https://pypi.python.org/pypi/threaded\n.. image:: https://img.shields.io/github/license/python-useful-helpers/threaded.svg\n    :target: https://raw.githubusercontent.com/python-useful-helpers/threaded/master/LICENSE\n.. image:: https://img.shields.io/badge/code%20style-black-000000.svg\n    :target: https://github.com/ambv/black\n\nthreaded is a set of decorators, which wrap functions in:\n\n  * `concurrent.futures.ThreadPool`\n  * `threading.Thread`\n  * `asyncio.Task` in Python 3.\n\nWhy? Because copy-paste of `loop.create_task`, `threading.Thread` and `thread_pool.submit` is boring,\nespecially if target functions is used by this way only.\n\nPros:\n\n* Free software: Apache license\n* Open Source: https://github.com/python-useful-helpers/threaded\n* PyPI packaged: https://pypi.python.org/pypi/threaded\n* Tested: see bages on top\n\nDecorators:\n\n* `ThreadPooled` - native ``concurrent.futures.ThreadPool``.\n* `threadpooled` is alias for `ThreadPooled`.\n\n* `Threaded` - wrap in ``threading.Thread``.\n* `threaded` is alias for `Threaded`.\n\n* `AsyncIOTask` - wrap in ``asyncio.Task``. Uses the same API, as `ThreadPooled`.\n* `asynciotask` is alias for `AsyncIOTask`.\n\nUsage\n=====\n\nThreadPooled\n------------\nMostly it is required decorator: submit function to ThreadPoolExecutor on call.\n\n.. code-block:: python\n\n    threaded.ThreadPooled.configure(max_workers=3)\n\n.. note::\n\n    By default, if executor is not configured - it configures with default parameters: ``max_workers=CPU_COUNT * 5``\n\n.. code-block:: python\n\n    @threaded.ThreadPooled\n    def func():\n        pass\n\n    concurrent.futures.wait([func()])\n\nUsage with asyncio:\n\n.. note::\n\n    if `loop_getter` is not callable, `loop_getter_need_context` is ignored.\n\n.. code-block:: python\n\n    loop = asyncio.get_event_loop()\n    @threaded.ThreadPooled(loop_getter=loop, loop_getter_need_context=False)\n    def func():\n        pass\n\n    loop.run_until_complete(asyncio.wait_for(func(), timeout))\n\nPython 3.5+ usage with asyncio and loop extraction from call arguments:\n\n.. code-block:: python\n\n    loop_getter = lambda tgt_loop: tgt_loop\n    @threaded.ThreadPooled(loop_getter=loop_getter, loop_getter_need_context=True)  # loop_getter_need_context is required\n    def func(*args, **kwargs):\n        pass\n\n    loop = asyncio.get_event_loop()\n    loop.run_until_complete(asyncio.wait_for(func(loop), timeout))\n\nDuring application shutdown, pool can be stopped (while it will be recreated automatically, if some component will request).\n\n.. code-block:: python\n\n    threaded.ThreadPooled.shutdown()\n\nThreaded\n--------\nClassic ``threading.Thread``. Useful for running until close and self-closing threads without return.\n\nUsage example:\n\n.. code-block:: python\n\n    @threaded.Threaded\n    def func(*args, **kwargs):\n        pass\n\n    thread = func()\n    thread.start()\n    thread.join()\n\nWithout arguments, thread name will use pattern: ``'Threaded: ' + func.__name__``\n\n.. note::\n\n    If func.__name__ is not accessible, str(hash(func)) will be used instead.\n\nOverride name can be don via corresponding argument:\n\n.. code-block:: python\n\n    @threaded.Threaded(name='Function in thread')\n    def func(*args, **kwargs):\n        pass\n\nThread can be daemonized automatically:\n\n.. code-block:: python\n\n    @threaded.Threaded(daemon=True)\n    def func(*args, **kwargs):\n        pass\n\nAlso, if no any addition manipulations expected before thread start,\nit can be started automatically before return:\n\n.. code-block:: python\n\n    @threaded.Threaded(started=True)\n    def func(*args, **kwargs):\n        pass\n\nAsyncIOTask\n-----------\nWrap in ``asyncio.Task``.\n\nusage with asyncio:\n\n.. code-block:: python\n\n    @threaded.AsyncIOTask\n    def func():\n        pass\n\n    loop = asyncio.get_event_loop()\n    loop.run_until_complete(asyncio.wait_for(func(), timeout))\n\nProvide event loop directly:\n\n.. note::\n\n    if `loop_getter` is not callable, `loop_getter_need_context` is ignored.\n\n.. code-block:: python\n\n    loop = asyncio.get_event_loop()\n    @threaded.AsyncIOTask(loop_getter=loop)\n    def func():\n        pass\n\n    loop.run_until_complete(asyncio.wait_for(func(), timeout))\n\nUsage with loop extraction from call arguments:\n\n.. code-block:: python\n\n    loop_getter = lambda tgt_loop: tgt_loop\n    @threaded.AsyncIOTask(loop_getter=loop_getter, loop_getter_need_context=True)\n    def func(*args, **kwargs):\n        pass\n\n    loop = asyncio.get_event_loop()\n    loop.run_until_complete(asyncio.wait_for(func(loop), timeout))\n\nTesting\n=======\nThe main test mechanism for the package `threaded` is using `tox`.\nAvailable environments can be collected via `tox -l`\n\nCI systems\n==========\nFor code checking several CI systems is used in parallel:\n\n2. `GitHub actions: <https://github.com/python-useful-helpers/threaded/actions>`_ is used for checking: PEP8, pylint, bandit, installation possibility and unit tests.\n3. `coveralls: <https://coveralls.io/github/python-useful-helpers/threaded>`_ is used for coverage display.\n\nCD system\n=========\n`GitHub actions: <https://github.com/python-useful-helpers/threaded/actions>`_ is used for package delivery on PyPI.\n",
    "bugtrack_url": null,
    "license": "Apache-2.0",
    "summary": "Decorators for running functions in Thread/ThreadPool/IOLoop",
    "version": "4.2.0",
    "project_urls": {
        "Bug Tracker": "https://github.com/python-useful-helpers/threaded/issues",
        "Documentation": "https://threaded.readthedocs.io/",
        "Homepage": "https://github.com/python-useful-helpers/threaded",
        "Repository": "https://github.com/python-useful-helpers/threaded"
    },
    "split_keywords": [
        "pooling",
        "multithreading",
        "threading",
        "asyncio",
        "development"
    ],
    "urls": [
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "109573199a901add89078c9620297cc76aa547e7aed9af77f651874526e2255e",
                "md5": "32c625d2b878cb79ccc54c3988f240f8",
                "sha256": "289b4b43a3675ddec5fcff189e53b0d42044b61d4fd2241e35ead5abc15db439"
            },
            "downloads": -1,
            "filename": "threaded-4.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
            "has_sig": false,
            "md5_digest": "32c625d2b878cb79ccc54c3988f240f8",
            "packagetype": "bdist_wheel",
            "python_version": "cp310",
            "requires_python": ">=3.8.0",
            "size": 942656,
            "upload_time": "2023-11-22T15:40:54",
            "upload_time_iso_8601": "2023-11-22T15:40:54.439127Z",
            "url": "https://files.pythonhosted.org/packages/10/95/73199a901add89078c9620297cc76aa547e7aed9af77f651874526e2255e/threaded-4.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "ae96812f9b6545ca71c3cb39f732411435ececf6ee8517cee333419b32f34999",
                "md5": "fe42db0a042f6da2a8e34a8a78cd0077",
                "sha256": "7550d788bc96e73a70821b481f376f2ebd7afdb40f395651374318cecdebe8e7"
            },
            "downloads": -1,
            "filename": "threaded-4.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "has_sig": false,
            "md5_digest": "fe42db0a042f6da2a8e34a8a78cd0077",
            "packagetype": "bdist_wheel",
            "python_version": "cp310",
            "requires_python": ">=3.8.0",
            "size": 948144,
            "upload_time": "2023-11-22T15:40:57",
            "upload_time_iso_8601": "2023-11-22T15:40:57.076553Z",
            "url": "https://files.pythonhosted.org/packages/ae/96/812f9b6545ca71c3cb39f732411435ececf6ee8517cee333419b32f34999/threaded-4.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "0b4f47678cf8a27ef168f33f2f9d892ae4252f023aa18e2bb84c8c027c458884",
                "md5": "f8b9bdb26268a0465feed8b1276e4751",
                "sha256": "97418c1029796b35b709915435ea77443ef2565e07ac0c2e2bc6d76a9f013317"
            },
            "downloads": -1,
            "filename": "threaded-4.2.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl",
            "has_sig": false,
            "md5_digest": "f8b9bdb26268a0465feed8b1276e4751",
            "packagetype": "bdist_wheel",
            "python_version": "cp310",
            "requires_python": ">=3.8.0",
            "size": 910924,
            "upload_time": "2023-11-22T15:40:58",
            "upload_time_iso_8601": "2023-11-22T15:40:58.589488Z",
            "url": "https://files.pythonhosted.org/packages/0b/4f/47678cf8a27ef168f33f2f9d892ae4252f023aa18e2bb84c8c027c458884/threaded-4.2.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": "dcd046cfd866f7a26bf885d9b422cd1f9d60ceb6d89c3b8372d53539050d275a",
                "md5": "3c12488c35f84f9fc06778dece91cf0c",
                "sha256": "6f4360a4ab56ac24450ef5a8696cb8defbdd11b0a9efe8cbc03213776e3d19d6"
            },
            "downloads": -1,
            "filename": "threaded-4.2.0-cp310-cp310-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "3c12488c35f84f9fc06778dece91cf0c",
            "packagetype": "bdist_wheel",
            "python_version": "cp310",
            "requires_python": ">=3.8.0",
            "size": 185730,
            "upload_time": "2023-11-22T15:41:00",
            "upload_time_iso_8601": "2023-11-22T15:41:00.911164Z",
            "url": "https://files.pythonhosted.org/packages/dc/d0/46cfd866f7a26bf885d9b422cd1f9d60ceb6d89c3b8372d53539050d275a/threaded-4.2.0-cp310-cp310-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "df520233e4fada165425fac006f63cb7f97a558962dada06e32f4a056d123817",
                "md5": "af4ba5511cad85ffb7108bf3a7df11c8",
                "sha256": "c8bc318d37078af559ccb5fcf63cfb979aa5207fa7a5e6e136aab546762884a4"
            },
            "downloads": -1,
            "filename": "threaded-4.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
            "has_sig": false,
            "md5_digest": "af4ba5511cad85ffb7108bf3a7df11c8",
            "packagetype": "bdist_wheel",
            "python_version": "cp311",
            "requires_python": ">=3.8.0",
            "size": 1081213,
            "upload_time": "2023-11-22T15:41:02",
            "upload_time_iso_8601": "2023-11-22T15:41:02.204076Z",
            "url": "https://files.pythonhosted.org/packages/df/52/0233e4fada165425fac006f63cb7f97a558962dada06e32f4a056d123817/threaded-4.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "6279cf488cd0c9b5b167582167d5707e511415567cfdee4950b5108b9d3274c3",
                "md5": "798ce6f703a43459cf1ba73f788931d5",
                "sha256": "3ed7419f4409b20b45ec07c8c8dbc59d47f86f8735871b7e1d995b22b548226c"
            },
            "downloads": -1,
            "filename": "threaded-4.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "has_sig": false,
            "md5_digest": "798ce6f703a43459cf1ba73f788931d5",
            "packagetype": "bdist_wheel",
            "python_version": "cp311",
            "requires_python": ">=3.8.0",
            "size": 1080433,
            "upload_time": "2023-11-22T15:41:03",
            "upload_time_iso_8601": "2023-11-22T15:41:03.934531Z",
            "url": "https://files.pythonhosted.org/packages/62/79/cf488cd0c9b5b167582167d5707e511415567cfdee4950b5108b9d3274c3/threaded-4.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "c6d6db57bd2a5d71a99b966b9fc8bd07f1ad47e327712af0ec1ae8ce958226a3",
                "md5": "0b94b0a88407a21dbb71c5c7c408b8ca",
                "sha256": "14d59d028947221422b480eed89c86aca5a5015d70d59f1508a49c6be179c001"
            },
            "downloads": -1,
            "filename": "threaded-4.2.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl",
            "has_sig": false,
            "md5_digest": "0b94b0a88407a21dbb71c5c7c408b8ca",
            "packagetype": "bdist_wheel",
            "python_version": "cp311",
            "requires_python": ">=3.8.0",
            "size": 1039760,
            "upload_time": "2023-11-22T15:41:05",
            "upload_time_iso_8601": "2023-11-22T15:41:05.470896Z",
            "url": "https://files.pythonhosted.org/packages/c6/d6/db57bd2a5d71a99b966b9fc8bd07f1ad47e327712af0ec1ae8ce958226a3/threaded-4.2.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": "422cc284b701df74137f559b4f8b24fdf1fff2c1d95f4a7c2a47d2eb687b13b2",
                "md5": "350e04a538b76094b747c9f0772638aa",
                "sha256": "04f769a5e5c3c251e64f4cf2c5d099d1327277fd7ab5874749501f1599f65de4"
            },
            "downloads": -1,
            "filename": "threaded-4.2.0-cp311-cp311-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "350e04a538b76094b747c9f0772638aa",
            "packagetype": "bdist_wheel",
            "python_version": "cp311",
            "requires_python": ">=3.8.0",
            "size": 185356,
            "upload_time": "2023-11-22T15:41:07",
            "upload_time_iso_8601": "2023-11-22T15:41:07.351624Z",
            "url": "https://files.pythonhosted.org/packages/42/2c/c284b701df74137f559b4f8b24fdf1fff2c1d95f4a7c2a47d2eb687b13b2/threaded-4.2.0-cp311-cp311-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "3bf09b733946c44a3fd2cc700dcc112ddf18e8078b725a701240fa7439653a00",
                "md5": "a679bd0bb199360aeb2557fa90457cea",
                "sha256": "0d047f61d8df945af3904a233e094ae7ae285c7baefb97bac2b2ba9cee60d463"
            },
            "downloads": -1,
            "filename": "threaded-4.2.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
            "has_sig": false,
            "md5_digest": "a679bd0bb199360aeb2557fa90457cea",
            "packagetype": "bdist_wheel",
            "python_version": "cp312",
            "requires_python": ">=3.8.0",
            "size": 1130802,
            "upload_time": "2023-11-22T15:41:09",
            "upload_time_iso_8601": "2023-11-22T15:41:09.010242Z",
            "url": "https://files.pythonhosted.org/packages/3b/f0/9b733946c44a3fd2cc700dcc112ddf18e8078b725a701240fa7439653a00/threaded-4.2.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "0d77d94173d6cdcc996989e7ba95cb1998db766a603ae5eff8cf8d7e4c948dfd",
                "md5": "36ab43f8e6eaac17bfab2d7b77c50822",
                "sha256": "ee692bc4e8fd833dad32610342a6a0ede9e5dbd26e080abf56e9f62d322b05a5"
            },
            "downloads": -1,
            "filename": "threaded-4.2.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "has_sig": false,
            "md5_digest": "36ab43f8e6eaac17bfab2d7b77c50822",
            "packagetype": "bdist_wheel",
            "python_version": "cp312",
            "requires_python": ">=3.8.0",
            "size": 1137902,
            "upload_time": "2023-11-22T15:41:11",
            "upload_time_iso_8601": "2023-11-22T15:41:11.080138Z",
            "url": "https://files.pythonhosted.org/packages/0d/77/d94173d6cdcc996989e7ba95cb1998db766a603ae5eff8cf8d7e4c948dfd/threaded-4.2.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "2a2bb301e867a25b5629123b840ff8fbc2ab5eedc2e20123482074dd08d43068",
                "md5": "2cf1c5f78915d9fb4f91ade632e4964c",
                "sha256": "4edbf0ccf76ac77b03334703ed85a8db25185405370c10a493bded70f3572ad3"
            },
            "downloads": -1,
            "filename": "threaded-4.2.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl",
            "has_sig": false,
            "md5_digest": "2cf1c5f78915d9fb4f91ade632e4964c",
            "packagetype": "bdist_wheel",
            "python_version": "cp312",
            "requires_python": ">=3.8.0",
            "size": 1087016,
            "upload_time": "2023-11-22T15:41:12",
            "upload_time_iso_8601": "2023-11-22T15:41:12.602924Z",
            "url": "https://files.pythonhosted.org/packages/2a/2b/b301e867a25b5629123b840ff8fbc2ab5eedc2e20123482074dd08d43068/threaded-4.2.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": "3e093d650820c9bee7736034e6d2ab084ce42487dcabfbf1f9408e7886a8b30a",
                "md5": "431c56b613a3d4fe718fff5c09682685",
                "sha256": "1ca6e8a3cc8886ce7a64eab9c477577220164aee9fdd27decfe20fb5e78e2871"
            },
            "downloads": -1,
            "filename": "threaded-4.2.0-cp312-cp312-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "431c56b613a3d4fe718fff5c09682685",
            "packagetype": "bdist_wheel",
            "python_version": "cp312",
            "requires_python": ">=3.8.0",
            "size": 184832,
            "upload_time": "2023-11-22T15:41:14",
            "upload_time_iso_8601": "2023-11-22T15:41:14.080612Z",
            "url": "https://files.pythonhosted.org/packages/3e/09/3d650820c9bee7736034e6d2ab084ce42487dcabfbf1f9408e7886a8b30a/threaded-4.2.0-cp312-cp312-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "ade16c6ddacf7ad11fb79a506534bd7aaf875a4401d0856161d1d79c6c878a56",
                "md5": "7639f26b3100a2a547b34c5e1ece97ef",
                "sha256": "93f36eaf4b6880fc373633d2b4740be798d58298ae0b6b6dc598a1ded901922d"
            },
            "downloads": -1,
            "filename": "threaded-4.2.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
            "has_sig": false,
            "md5_digest": "7639f26b3100a2a547b34c5e1ece97ef",
            "packagetype": "bdist_wheel",
            "python_version": "cp38",
            "requires_python": ">=3.8.0",
            "size": 965802,
            "upload_time": "2023-11-22T15:41:15",
            "upload_time_iso_8601": "2023-11-22T15:41:15.366954Z",
            "url": "https://files.pythonhosted.org/packages/ad/e1/6c6ddacf7ad11fb79a506534bd7aaf875a4401d0856161d1d79c6c878a56/threaded-4.2.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "abdbbf098374b8231a62914665455ce246143488ad7ad9da8a039b4539537740",
                "md5": "c55ba5d827edbac6d33fff5cb8a26e40",
                "sha256": "b23ff0545f7b6458463c6d9baefee9239b9e6bf721d65099f173a4a5690eba63"
            },
            "downloads": -1,
            "filename": "threaded-4.2.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "has_sig": false,
            "md5_digest": "c55ba5d827edbac6d33fff5cb8a26e40",
            "packagetype": "bdist_wheel",
            "python_version": "cp38",
            "requires_python": ">=3.8.0",
            "size": 971893,
            "upload_time": "2023-11-22T15:41:17",
            "upload_time_iso_8601": "2023-11-22T15:41:17.430857Z",
            "url": "https://files.pythonhosted.org/packages/ab/db/bf098374b8231a62914665455ce246143488ad7ad9da8a039b4539537740/threaded-4.2.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "5866fddec82a7b565f2420156eb64e1d229ac50d2c1a3515d6bc02c8f52a0245",
                "md5": "2732f8da88effa229d878856af9389a8",
                "sha256": "7c52ea5c2d631b64d8f616fc9360320844087fa5257353edc2d360330cbc467d"
            },
            "downloads": -1,
            "filename": "threaded-4.2.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl",
            "has_sig": false,
            "md5_digest": "2732f8da88effa229d878856af9389a8",
            "packagetype": "bdist_wheel",
            "python_version": "cp38",
            "requires_python": ">=3.8.0",
            "size": 938294,
            "upload_time": "2023-11-22T15:41:19",
            "upload_time_iso_8601": "2023-11-22T15:41:19.412267Z",
            "url": "https://files.pythonhosted.org/packages/58/66/fddec82a7b565f2420156eb64e1d229ac50d2c1a3515d6bc02c8f52a0245/threaded-4.2.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "74005096b1c2146534c0744e0c7bc443af3936c1017a7c870d2ab32954a845a6",
                "md5": "ccd679ac16cccf69c8ded270763a75e2",
                "sha256": "a3fde9845f7704110d936687fd2b2b013e0822e5000907e05a900d98fd687ef9"
            },
            "downloads": -1,
            "filename": "threaded-4.2.0-cp38-cp38-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "ccd679ac16cccf69c8ded270763a75e2",
            "packagetype": "bdist_wheel",
            "python_version": "cp38",
            "requires_python": ">=3.8.0",
            "size": 188776,
            "upload_time": "2023-11-22T15:41:21",
            "upload_time_iso_8601": "2023-11-22T15:41:21.488825Z",
            "url": "https://files.pythonhosted.org/packages/74/00/5096b1c2146534c0744e0c7bc443af3936c1017a7c870d2ab32954a845a6/threaded-4.2.0-cp38-cp38-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "2a5634f80bfffd99493e3da90f66c712b0146dc95d2dea5c0a2b37bd88e2dc70",
                "md5": "daf6090ebf2dfdfd593f3ddd4aa8c4da",
                "sha256": "7a8839c74e5d88ca7cba346cec394d30e5ec0002e7a59d718df9f2dd331d653d"
            },
            "downloads": -1,
            "filename": "threaded-4.2.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
            "has_sig": false,
            "md5_digest": "daf6090ebf2dfdfd593f3ddd4aa8c4da",
            "packagetype": "bdist_wheel",
            "python_version": "cp39",
            "requires_python": ">=3.8.0",
            "size": 952962,
            "upload_time": "2023-11-22T15:41:22",
            "upload_time_iso_8601": "2023-11-22T15:41:22.875490Z",
            "url": "https://files.pythonhosted.org/packages/2a/56/34f80bfffd99493e3da90f66c712b0146dc95d2dea5c0a2b37bd88e2dc70/threaded-4.2.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "cc8ac54e1b37c48f31a7e3fc7bea3414f4fff946bba4b25c5ce6e0a5d901516c",
                "md5": "ab68db9d219b64b9e0529069f74e2a89",
                "sha256": "0a85db2d603bdb4da5ab6fdd475ade0f56820fe6d191bc647ef68b3983aa2f98"
            },
            "downloads": -1,
            "filename": "threaded-4.2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "has_sig": false,
            "md5_digest": "ab68db9d219b64b9e0529069f74e2a89",
            "packagetype": "bdist_wheel",
            "python_version": "cp39",
            "requires_python": ">=3.8.0",
            "size": 959178,
            "upload_time": "2023-11-22T15:41:26",
            "upload_time_iso_8601": "2023-11-22T15:41:26.071104Z",
            "url": "https://files.pythonhosted.org/packages/cc/8a/c54e1b37c48f31a7e3fc7bea3414f4fff946bba4b25c5ce6e0a5d901516c/threaded-4.2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "2a393ffc37b58df6777a43b7d78578ed960799f764a67967d17be4f1a6274381",
                "md5": "bcd44e6c686b35dccdbb694765818eaa",
                "sha256": "00c1910f722d50e2717ffd5fe8c66e137766eb9c6d78a13992fec11697dc68b0"
            },
            "downloads": -1,
            "filename": "threaded-4.2.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl",
            "has_sig": false,
            "md5_digest": "bcd44e6c686b35dccdbb694765818eaa",
            "packagetype": "bdist_wheel",
            "python_version": "cp39",
            "requires_python": ">=3.8.0",
            "size": 921568,
            "upload_time": "2023-11-22T15:41:27",
            "upload_time_iso_8601": "2023-11-22T15:41:27.706652Z",
            "url": "https://files.pythonhosted.org/packages/2a/39/3ffc37b58df6777a43b7d78578ed960799f764a67967d17be4f1a6274381/threaded-4.2.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": "627b178c1a4a43071617b2e46c1b145171b882329a1b638c775d7edf26f932e4",
                "md5": "369b3ca14fd33ade57a43359033e84f7",
                "sha256": "bbb618a80d79caadd7adfb3dff192681e363871fa12bf3e4ef49ee874e55fa91"
            },
            "downloads": -1,
            "filename": "threaded-4.2.0-cp39-cp39-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "369b3ca14fd33ade57a43359033e84f7",
            "packagetype": "bdist_wheel",
            "python_version": "cp39",
            "requires_python": ">=3.8.0",
            "size": 188073,
            "upload_time": "2023-11-22T15:41:29",
            "upload_time_iso_8601": "2023-11-22T15:41:29.153604Z",
            "url": "https://files.pythonhosted.org/packages/62/7b/178c1a4a43071617b2e46c1b145171b882329a1b638c775d7edf26f932e4/threaded-4.2.0-cp39-cp39-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "1330e4de40c850009f821892d8a7683c806a43eb2c48a06241f1b087f7546022",
                "md5": "f948bcc70244c2e3f0b5c0203f61d085",
                "sha256": "38c1a05f30597b45f5fe83d561387626f6f24ff5954567e0a29d90083df22c1b"
            },
            "downloads": -1,
            "filename": "threaded-4.2.0-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "f948bcc70244c2e3f0b5c0203f61d085",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.8.0",
            "size": 25350,
            "upload_time": "2023-11-22T15:41:30",
            "upload_time_iso_8601": "2023-11-22T15:41:30.379473Z",
            "url": "https://files.pythonhosted.org/packages/13/30/e4de40c850009f821892d8a7683c806a43eb2c48a06241f1b087f7546022/threaded-4.2.0-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "78a4a89571c3e6c50dfc2087c33680775e66582c6a795237af4d264a63c78d15",
                "md5": "af2b19a7e3c942fbc253eebba9fe26ae",
                "sha256": "83ad4f3826b465af8b56b373589b13eaebe2733a8772201ce4d1ad2ad2c52515"
            },
            "downloads": -1,
            "filename": "threaded-4.2.0.tar.gz",
            "has_sig": false,
            "md5_digest": "af2b19a7e3c942fbc253eebba9fe26ae",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.8.0",
            "size": 30116,
            "upload_time": "2023-11-22T15:41:31",
            "upload_time_iso_8601": "2023-11-22T15:41:31.467422Z",
            "url": "https://files.pythonhosted.org/packages/78/a4/a89571c3e6c50dfc2087c33680775e66582c6a795237af4d264a63c78d15/threaded-4.2.0.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2023-11-22 15:41:31",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "python-useful-helpers",
    "github_project": "threaded",
    "travis_ci": false,
    "coveralls": false,
    "github_actions": true,
    "requirements": [],
    "tox": true,
    "lcname": "threaded"
}
        
Elapsed time: 3.69074s