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"
}