{ "info": { "author": "Justin Engel", "author_email": "jtengel08@gmail.com", "bugtrack_url": null, "classifiers": [ "Operating System :: OS Independent", "Programming Language :: Python", "Programming Language :: Python :: 3" ], "description": "====================\ncontinuous_threading\n====================\n\nThis library provides several classes to help manage threads that run continuously.\n\nThere are some problems with threads runing continuously in a loop. Calculation threads are greedy and keep running \nwhich starves other threads. Another problem is if you don't exit an infinite loop in a thread it may keep running \nafter python has tried to exit. Daemon threads will close, but resources/variables may not be cleaned up properly. \nMostly, I needed to finish writing data to a file before the thread closed. This library aims to solve those problems.\n\nThis library provides a couple of main thread utilities:\n * Thread - threading with context manager support\n * ContinuousThread - Run a function continuously in a loop (It is suggested sleep is called periodically if no I/O)\n * PausableThread - Continuous thread that can be stopped and started again.\n * OperationThread - Thread that will run a calculation in a separate thread with different data.\n * PeriodicThread - Thread that runs a function periodically at a given interval.\n * shutdown - Call `join(timeout)` on every non-daemon thread that is active.\n\n\nShutdown Update!\n================\n\nNoticed issue with Python 3.8 on Windows. Python's threading._shutdown method can hang forever preventing the\nprocess from exiting. This library is dependent on that function. I override threading._shutdown to automatically\n\"join\" all non-daemon threads.\n\nNote: Python's threading.Thread has a `_stop` method. Try not to override this method.\n\n\nProblem\n-------\n\n.. code-block:: python\n\n import time\n import threading\n\n c = 0\n\n def count_loop():\n global c\n\n while True:\n c += 1\n time.sleep(1)\n\n th = threading.Thread(target=count_loop)\n th.start()\n\n time.sleep(5)\n print('Count:', c)\n\n # Process will not exit, because thread is running and cannot end\n\n\nSolution\n--------\n\nAdded an `allow_shutdown()` method and a `shutdown()` function.\nThe \"ContinuousThread\", \"PausableThread\", \"OperationThread\", and \"PeriodicThread\" do not have this problem.\nThe continuous_threading library overrides `threading._shutdown` and has fixes to allow ContinuousThread's to close\nautomatically.\n\n.. code-block:: python\n\n import time\n import continuous_threading\n\n c = 0\n\n def count():\n global c\n c += 1\n time.sleep(1)\n\n th = continuous_threading.ContinuousThread(target=count)\n th.start()\n\n time.sleep(5)\n print('Count:', c)\n\n # Process will automatically exit with threading._shutdown() override\n\n\n.. code-block:: python\n\n import time\n import continuous_threading\n\n c = 0\n\n def count_loop():\n global c\n\n while True:\n c += 1\n time.sleep(1)\n\n th = continuous_threading.Thread(target=count_loop)\n th.start()\n\n time.sleep(5)\n print('Count:', c)\n\n continuous_threading.shutdown(0) # Call join on every non-daemon Thread.\n\n # Alternative. This does not call join normally. continuous_threading threading._shutdown override does call \"join\".\n # th.allow_shutdown() # Release \"_tstate_lock\" allowing threading._shutdown to continue\n\n # Process will exit, because allow_shutdown or shutdown\n\n\nClose Infinite Loop Threads Automatically\n-----------------------------------------\n\nControl how the override threading._shutdown works.\n\n.. code-block:: python\n\n import time\n import continuous_threading\n\n # Change threading._shutdown() to automatically call Thread.allow_shutdown()\n continuous_threading.set_allow_shutdown(True)\n continuous_threading.set_shutdown_timeout(0) # Default 1\n\n c = 0\n\n def count_loop():\n global c\n\n while True:\n c += 1\n time.sleep(1)\n\n th = continuous_threading.Thread(target=count_loop)\n th.start()\n\n time.sleep(5)\n print('Count:', c)\n\n # Process will exit due to \"set_allow_shutdown\"\n\n\nCan also just call `continuous_threading.shutdown()`\n\nRemove threading._shutdown() override\n-------------------------------------\n\nYou can change the threading._shutdown function with\n\n.. code-block:: python\n\n import continuous_threading\n\n # Change back to original threading._shutdown function\n continuous_threading.reset_shutdown()\n\n # Set custom function or leave empty to use continuous_threading custom_shutdown()\n continuous_threading.set_shutdown()\n\n\nThread context manager\n======================\nThis library turns threads into a context manager which automatically starts and stops threads.\n\n.. code-block:: python\n\n import continuous_threading\n\n thread_success = [False]\n\n def do_something():\n print('here')\n thread_success[0] = True\n\n\n with continuous_threading.Thread(target=do_something):\n print('in context')\n\n assert thread_success[0] is True\n\n\nContinuousThread\n================\nThe ContinuousThread is a simple thread in an infinite while loop. The while loop keeps looping while the thread \nalive Event is set. Call `thread.stop()`, `thread.close()`, or `thread.join()` to stop the thread. The thread should \nalso stop automatically when the python program is exiting/closing.\n\n.. code-block:: python\n\n import continuous_threading\n\n class CountingThread(continuous_threading.ContinuousThread):\n def __init__(self):\n super().__init__()\n self.counter = 0\n\n def _run(self):\n self.counter += 1\n\n\n with CountingThread() as th:\n print('in context')\n\n assert th.counter > 0\n print(\"Simple context manager print caused %d thread iterations\" % th.counter)\n\n\nExample of start and stop methods.\n.. code-block:: python\n\n import time\n import continuous_threading\n\n class CountingThread(continuous_threading.ContinuousThread):\n def __init__(self):\n super().__init__()\n self.counter = 0\n\n def _run(self):\n self.counter += 1\n\n th = CountingThread()\n th.start()\n time.sleep(0.1)\n th.stop() # or th.close() or th.join()\n\n assert th.counter > 0\n print(\"Simple context manager print caused %d thread iterations\" % th.counter)\n\n\nNew init function\n.. code-block:: python\n\n import time\n import continuous_threading\n\n COUNTER = [0]\n\n def init_counter():\n return {'counter': COUNTER} # dict gets pass as kwargs to the target function.\n\n def inc_coutner(counter):\n counter[0] += 1\n\n th = continuous_threading.ContinuousThread(target=inc_counter, init=init_counter)\n th.start()\n time.sleep(0.1)\n th.stop() # or th.close() or th.join()\n\n assert th.counter > 0\n print(\"Simple context manager print caused %d thread iterations\" % th.counter)\n\n\nPausableThread\n==============\nA continuous thread that can be stopped and started again.\n\n.. code-block:: python\n\n import time\n import continuous_threading\n\n\n counter = [0]\n\n def inc_counter():\n counter[0] += 1\n\n th = continuous_threading.PausableThread(target=inc_counter)\n\n th.start()\n time.sleep(0.1)\n\n th.stop()\n time.sleep(0.1)\n\n value = counter[0]\n assert value > 0\n\n time.sleep(0.1)\n assert value == counter[0]\n\n th.start()\n time.sleep(0.1)\n assert counter[0] > value\n\n\nAgain this can be used as a context manager.\n.. code-block:: python\n\n import time\n import continuous_threading\n\n class CountingThread(continuous_threading.PausableThread):\n def __init__(self):\n super().__init__()\n self.counter = 0\n\n def _run(self):\n self.counter += 1\n\n with CountingThread() as th:\n time.sleep(0.1)\n th.stop()\n value = th.counter\n assert value > 0\n\n time.sleep(0.1)\n assert value == th.counter\n\n th.start()\n time.sleep(0.1)\n assert th.counter > value\n\n\nPeriodicThread\n==============\n\nRun a function periodically.\n\n.. code-block:: python\n\n import time\n import continuous_threading\n\n\n time_list = []\n\n def save_time():\n time_list.append(time.time())\n\n th = continuous_threading.PeriodicThread(0.5, save_time)\n th.start()\n\n time.sleep(4)\n th.join()\n\n print(time_list)\n\n\nOperationThread\n===============\nAdd data to a queue which will be operated on in a separate thread.\n\n.. code-block:: python\n\n import time\n import continuous_threading\n\n\n values = []\n\n def run_calculation(data1, data2):\n values.append(data1 + data2)\n\n th = continuous_threading.OperationThread(target=run_calculation)\n th.start()\n th.add_data(1, 1)\n time.sleep(0.1)\n\n assert len(values) > 0\n assert values[0] == 2\n\n th.add_data(2, 2)\n th.add_data(3, 3)\n th.add_data(4, 4)\n th.add_data(5, 5)\n\n time.sleep(0.1)\n assert values == [2, 4, 6, 8, 10]\n\n\nProcess\n=======\n\nAll of the above Thread classes can also be used as a separate Process:\n * Process\n * ContinuousProcess\n * PausableProcess\n * PeriodicProcess\n * OperationProcess\n * CommandProcess\n\n\nCommandProcess\n--------------\n\nRun functions and commands on an object that lives in a different process.\n\n.. code-block:: python\n\n from continuous_threading import CommandProcess\n\n\n class MyObj(object):\n def __init__(self, x=0, y=0):\n self._x = x\n self._y = y\n\n def set_x(self, x):\n self._x = x\n\n def set_y(self, y):\n self._y = y\n\n def print_obj(self, msg=''):\n print(self._x, self._y, msg)\n\n def expect(self, x, y, msg=''):\n assert self._x == x, 'X value {} does not match expected {}'.format(self._x, x)\n assert self._y == y, 'Y value {} does not match expected {}'.format(self._y, y)\n self.print_obj(msg=msg)\n\n\n obj1 = MyObj()\n obj2 = MyObj()\n\n proc = CommandProcess(target=obj1)\n proc.start()\n\n # Send a command obj1\n print('Main Obj1') # Note: this prints way earlier\n proc.send_cmd('print_obj', msg=\"Obj1\")\n proc.send_cmd('set_x', 1)\n proc.send_cmd('print_obj')\n proc.send_cmd('set_y', 2)\n proc.send_cmd('print_obj')\n proc.send_cmd('expect', 1, 2, msg='Obj1 expected (1,2)')\n\n # Send a command obj2\n print('Main Obj2') # Note: this prints way earlier\n proc.obj = obj2\n proc.send_cmd('print_obj', msg=\"Obj2\")\n proc.send_cmd('set_x', 2)\n proc.send_cmd('print_obj')\n proc.send_cmd('set_y', 4)\n proc.send_cmd('print_obj')\n proc.send_cmd('expect', 2, 4, msg='Obj2 expected (2,4)')\n\n # *** IGNORE COMMENTS: I implemented a caching system to save object state. ***\n # Change back to obj1 (Remember this obj has attr 0,0 and when sent to other process will be a new obj 0,0).\n # Cannot remember objects unless cached (saved in a dict) on the other process. id in process will be different.\n # ... NVM I'll just cache the obj value.\n print('Main Obj1 again (Cached)') # Note: this prints way earlier\n proc.obj = obj1\n proc.send_cmd('expect', 1, 2, msg=\"Obj1 Again (Cached)\")\n proc.send_cmd('set_x', 3)\n proc.send_cmd('print_obj')\n proc.send_cmd('set_y', 5)\n proc.send_cmd('print_obj')\n proc.send_cmd('expect', 3, 5, msg='Obj1 Again expected (3,5)')\n\n proc.join()\n\n\n", "description_content_type": "text/x-rst", "docs_url": null, "download_url": "https://github.com/justengel/continuous_threading/archive/v2.0.5.tar.gz", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/justengel/continuous_threading", "keywords": "threading continuous pausable", "license": "MIT", "maintainer": "", "maintainer_email": "", "name": "continuous-threading", "package_url": "https://pypi.org/project/continuous-threading/", "platform": "any", "project_url": "https://pypi.org/project/continuous-threading/", "project_urls": { "Download": "https://github.com/justengel/continuous_threading/archive/v2.0.5.tar.gz", "Homepage": "https://github.com/justengel/continuous_threading" }, "release_url": "https://pypi.org/project/continuous-threading/2.0.5/", "requires_dist": [ "psutil (>=5.4.0)" ], "requires_python": "", "summary": "Library to help manage threads that run continuously for a long time.", "version": "2.0.5", "yanked": false, "yanked_reason": null }, "last_serial": 12911608, "releases": { "0.0.1": [ { "comment_text": "", "digests": { "md5": "33e358bc87fdda8a3f68a7c80027f584", "sha256": "9dbc5af43844810780754c10416bc5fcb97ec888ebaf7103bdbf366f6b4f77da" }, "downloads": -1, "filename": "continuous_threading-0.0.1.tar.gz", "has_sig": false, "md5_digest": "33e358bc87fdda8a3f68a7c80027f584", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 7951, "upload_time": "2018-06-20T17:51:58", "upload_time_iso_8601": "2018-06-20T17:51:58.454415Z", "url": "https://files.pythonhosted.org/packages/fa/69/581768da97d3f8fd7955cbde38142ecb3ce6a31b3d544ddc9381a2aa61e5/continuous_threading-0.0.1.tar.gz", "yanked": false, "yanked_reason": null } ], "1.0.0": [ { "comment_text": "", "digests": { "md5": "19ff388665f84e137f5f014d457ed2f5", "sha256": "ca6522ba6d94bfde7fd5656d90ac228c5b054d44d379c56f30826cbb8918d25e" }, "downloads": -1, "filename": "continuous_threading-1.0.0.tar.gz", "has_sig": false, "md5_digest": "19ff388665f84e137f5f014d457ed2f5", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 8103, "upload_time": "2018-06-20T17:58:29", "upload_time_iso_8601": "2018-06-20T17:58:29.943127Z", "url": "https://files.pythonhosted.org/packages/0b/f6/cb038fb23b86c4a06edcfd133d34d8cfe6c8cf1cb787b02d3fd4c1416039/continuous_threading-1.0.0.tar.gz", "yanked": false, "yanked_reason": null } ], "1.0.1": [ { "comment_text": "", "digests": { "md5": "9d2ab00b36b4cb4439776781c4572950", "sha256": "6ac98da78811b17b7f97d42579520903d02dc0515f7d20828e875a885199deb7" }, "downloads": -1, "filename": "continuous_threading-1.0.1.tar.gz", "has_sig": false, "md5_digest": "9d2ab00b36b4cb4439776781c4572950", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 8116, "upload_time": "2018-06-20T18:20:41", "upload_time_iso_8601": "2018-06-20T18:20:41.682068Z", "url": "https://files.pythonhosted.org/packages/77/5d/69a135d47cc4b93973c0de3dd3887a96e719e92e1c36e680337b93e626a5/continuous_threading-1.0.1.tar.gz", "yanked": false, "yanked_reason": null } ], "1.0.2": [ { "comment_text": "", "digests": { "md5": "d3cb8b1933f3273e35e4d3ba85229731", "sha256": "7ff4d8fd1dbd06f0ada43e4e8f970fdfe2c53cc027328419c0b6549902e86196" }, "downloads": -1, "filename": "continuous_threading-1.0.2.tar.gz", "has_sig": false, "md5_digest": "d3cb8b1933f3273e35e4d3ba85229731", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 8165, "upload_time": "2018-08-06T11:43:10", "upload_time_iso_8601": "2018-08-06T11:43:10.423306Z", "url": "https://files.pythonhosted.org/packages/1f/c1/2e4bfb319da07373fac6e52111f3f21a3c83972c2025c4275b07503d1b90/continuous_threading-1.0.2.tar.gz", "yanked": false, "yanked_reason": null } ], "1.0.3": [ { "comment_text": "", "digests": { "md5": "dd3fd501c088a831381bd603a8c44d93", "sha256": "98dd547c2eb487443f42aa045fef854519ce0269da87b213de83321c66853d47" }, "downloads": -1, "filename": "continuous_threading-1.0.3.tar.gz", "has_sig": false, "md5_digest": "dd3fd501c088a831381bd603a8c44d93", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 8699, "upload_time": "2018-08-10T16:38:23", "upload_time_iso_8601": "2018-08-10T16:38:23.835361Z", "url": "https://files.pythonhosted.org/packages/b6/95/6ebe4afe41bc2da185d733a26bf6c6ef49596033746f4320894b0063329d/continuous_threading-1.0.3.tar.gz", "yanked": false, "yanked_reason": null } ], "1.0.4": [ { "comment_text": "", "digests": { "md5": "06081043dffd2988da7b03fea2d5fce5", "sha256": "81a91250ce1c367bac095fd4eb8e7a59b709de483bfcbc08b497b8f54d1927b0" }, "downloads": -1, "filename": "continuous_threading-1.0.4.tar.gz", "has_sig": false, "md5_digest": "06081043dffd2988da7b03fea2d5fce5", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 8704, "upload_time": "2018-08-16T16:53:39", "upload_time_iso_8601": "2018-08-16T16:53:39.709039Z", "url": "https://files.pythonhosted.org/packages/94/01/235a7004d8f48ca3b666201f04c3595a3fa4490065671d8919ec939b2647/continuous_threading-1.0.4.tar.gz", "yanked": false, "yanked_reason": null } ], "1.0.5": [ { "comment_text": "", "digests": { "md5": "4e265366bda1905f6336b161c34cb645", "sha256": "e6ca72f7a73603823aafa0f15cc4d10293fa7b66e3d493a94e6e31ba90af0ac8" }, "downloads": -1, "filename": "continuous_threading-1.0.5.tar.gz", "has_sig": false, "md5_digest": "4e265366bda1905f6336b161c34cb645", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 8810, "upload_time": "2018-10-24T18:42:16", "upload_time_iso_8601": "2018-10-24T18:42:16.591708Z", "url": "https://files.pythonhosted.org/packages/90/63/2d31b398495a5c73b733cbd91ccc5385b7f4bcf09108956bb07ac369f03c/continuous_threading-1.0.5.tar.gz", "yanked": false, "yanked_reason": null } ], "1.0.6": [ { "comment_text": "", "digests": { "md5": "f0de41f3b8ce5eed771427ca56e50e0d", "sha256": "98fd97cf53c4c2f9bc55317228dbd3052734bf740be36955d6a899507fda37b7" }, "downloads": -1, "filename": "continuous_threading-1.0.6.tar.gz", "has_sig": false, "md5_digest": "f0de41f3b8ce5eed771427ca56e50e0d", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 9008, "upload_time": "2019-01-02T20:42:09", "upload_time_iso_8601": "2019-01-02T20:42:09.805621Z", "url": "https://files.pythonhosted.org/packages/0f/58/0b0a8f870d06418c215f9b6b6a0dd18004e6d48a09c44c02fe34ca0603da/continuous_threading-1.0.6.tar.gz", "yanked": false, "yanked_reason": null } ], "1.0.7": [ { "comment_text": "", "digests": { "md5": "5525188dc8880402dcd72e12e90dc768", "sha256": "c65a4a9f3c6cf984d046c535eaa4a89381e2273639246dfdc840794eb75e1426" }, "downloads": -1, "filename": "continuous_threading-1.0.7.tar.gz", "has_sig": false, "md5_digest": "5525188dc8880402dcd72e12e90dc768", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 8858, "upload_time": "2019-02-28T16:19:22", "upload_time_iso_8601": "2019-02-28T16:19:22.874570Z", "url": "https://files.pythonhosted.org/packages/80/f8/6172392084e1e0ffce09804b83d1267e9969e697a7c2af2931646ad95096/continuous_threading-1.0.7.tar.gz", "yanked": false, "yanked_reason": null } ], "1.1.0": [ { "comment_text": "", "digests": { "md5": "25f03a59e4e76ffba55a4bea1fd5cbcd", "sha256": "8ff9aff360e5aa6e4d253a819af41f96a9cbba9bcb9f6d4dabdad295182b68f3" }, "downloads": -1, "filename": "continuous_threading-1.1.0.tar.gz", "has_sig": false, "md5_digest": "25f03a59e4e76ffba55a4bea1fd5cbcd", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 12705, "upload_time": "2019-10-25T15:41:22", "upload_time_iso_8601": "2019-10-25T15:41:22.734197Z", "url": "https://files.pythonhosted.org/packages/8f/76/607cd6f609062642e48cbf4ba68a58fda3ad9eb7ed28ea47c5c8d282d625/continuous_threading-1.1.0.tar.gz", "yanked": false, "yanked_reason": null } ], "1.1.1": [ { "comment_text": "", "digests": { "md5": "7272279eec2951513e7c70df63195124", "sha256": "e81e890cd2591ba146f96caab61192858f9ff9c6d9172953f1f1e13d71cf1f2d" }, "downloads": -1, "filename": "continuous_threading-1.1.1.tar.gz", "has_sig": false, "md5_digest": "7272279eec2951513e7c70df63195124", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 12744, "upload_time": "2020-02-16T01:23:02", "upload_time_iso_8601": "2020-02-16T01:23:02.609839Z", "url": "https://files.pythonhosted.org/packages/03/5f/068e10857699d453e049da72d13dbc5a07777738f7be84de6674a0498272/continuous_threading-1.1.1.tar.gz", "yanked": false, "yanked_reason": null } ], "1.2.0": [ { "comment_text": "", "digests": { "md5": "d070d6fa90926057911b51931ec792f3", "sha256": "7a66436979a48289c709787d19a2af1336d8ead01a8bc288a3c04ed5c9ff6e80" }, "downloads": -1, "filename": "continuous_threading-1.2.0-py3-none-any.whl", "has_sig": false, "md5_digest": "d070d6fa90926057911b51931ec792f3", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 15384, "upload_time": "2020-07-15T17:24:21", "upload_time_iso_8601": "2020-07-15T17:24:21.551989Z", "url": "https://files.pythonhosted.org/packages/23/8e/b58be8e075cfa6db23fb12308b00c131f8263252f3ffb86270b2cb869ba9/continuous_threading-1.2.0-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "677b0a059db07e338f0b97d80606c145", "sha256": "f4bfcd664d823f45d5072d301254d7df3fc84328782bede6af41c792aeccff17" }, "downloads": -1, "filename": "continuous_threading-1.2.0.tar.gz", "has_sig": false, "md5_digest": "677b0a059db07e338f0b97d80606c145", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 13424, "upload_time": "2020-07-15T17:24:09", "upload_time_iso_8601": "2020-07-15T17:24:09.289995Z", "url": "https://files.pythonhosted.org/packages/43/33/4a21882d02e07e584d983a3fb6fb25e25bd0b0e2b19a4ae901316961c531/continuous_threading-1.2.0.tar.gz", "yanked": false, "yanked_reason": null } ], "1.2.1": [ { "comment_text": "", "digests": { "md5": "a151a5fcacd86571d9e0c7e2ece92360", "sha256": "122a79fc6d612a2304653e88c31813bb533920572086de5042bcb95c98ba401b" }, "downloads": -1, "filename": "continuous_threading-1.2.1-py3-none-any.whl", "has_sig": false, "md5_digest": "a151a5fcacd86571d9e0c7e2ece92360", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 15478, "upload_time": "2020-08-04T00:02:09", "upload_time_iso_8601": "2020-08-04T00:02:09.810488Z", "url": "https://files.pythonhosted.org/packages/ea/5d/bc723531abcedc7f370e087d5b091edbeee40b9351ab64bf0c31d44bf7ea/continuous_threading-1.2.1-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "e1e45fddc0bac511cf88dcdb7cfc9e73", "sha256": "75144097b348fb1bd1df0192b9e076a7a3c972f3914cb50d2c55156fff311304" }, "downloads": -1, "filename": "continuous_threading-1.2.1.tar.gz", "has_sig": false, "md5_digest": "e1e45fddc0bac511cf88dcdb7cfc9e73", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 16317, "upload_time": "2020-08-04T00:02:10", "upload_time_iso_8601": "2020-08-04T00:02:10.935473Z", "url": "https://files.pythonhosted.org/packages/b1/fd/d86111553eaf93389ce1e5a1a53abc12ed313fad13cc3dcf0c7abb76f2f9/continuous_threading-1.2.1.tar.gz", "yanked": false, "yanked_reason": null } ], "1.3.0": [ { "comment_text": "", "digests": { "md5": "d274f097206d02dcc714999a5cf803d2", "sha256": "a04b3747375b3d8c6332c1fa1d7bde9d13b8d626339137a799021e608c6f40e2" }, "downloads": -1, "filename": "continuous_threading-1.3.0-py3-none-any.whl", "has_sig": false, "md5_digest": "d274f097206d02dcc714999a5cf803d2", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 16477, "upload_time": "2020-09-28T03:12:28", "upload_time_iso_8601": "2020-09-28T03:12:28.907909Z", "url": "https://files.pythonhosted.org/packages/10/65/4c3b12216a8d32028b501720b6f10b5210c01377d80ea6d65a5257c3ce4f/continuous_threading-1.3.0-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "bea8303b2fbbff5556c4276d397b2d55", "sha256": "dc66f293e37fd49bf387913dd76ea148227b861e861f96003ae0f3977a2bd7d8" }, "downloads": -1, "filename": "continuous_threading-1.3.0.tar.gz", "has_sig": false, "md5_digest": "bea8303b2fbbff5556c4276d397b2d55", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 17034, "upload_time": "2020-09-28T03:12:30", "upload_time_iso_8601": "2020-09-28T03:12:30.557826Z", "url": "https://files.pythonhosted.org/packages/4a/82/f24b76bf85a767232f521019b9f31db92a3b351f1d42f4b11df1c5b78789/continuous_threading-1.3.0.tar.gz", "yanked": false, "yanked_reason": null } ], "2.0.0": [ { "comment_text": "", "digests": { "md5": "bf7e6054802af0dff46232e2bd8d47cc", "sha256": "8856b49ad7cb8dbd3668195c57f3e23ff876e0e9e86de66610736fe1e3c0ab5d" }, "downloads": -1, "filename": "continuous_threading-2.0.0-py3-none-any.whl", "has_sig": false, "md5_digest": "bf7e6054802af0dff46232e2bd8d47cc", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 18908, "upload_time": "2020-10-12T19:04:48", "upload_time_iso_8601": "2020-10-12T19:04:48.893224Z", "url": "https://files.pythonhosted.org/packages/43/d5/7d1679d388c7054da5516d47db87721d78f40e093adc796a03b38e052b1c/continuous_threading-2.0.0-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "7ed7af6ad24a563d6ce842dd3e103460", "sha256": "ce01865f2706f46238878ecd17dad6293c90fb977e44b6d137d89ba745cb18b2" }, "downloads": -1, "filename": "continuous_threading-2.0.0.tar.gz", "has_sig": false, "md5_digest": "7ed7af6ad24a563d6ce842dd3e103460", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 19655, "upload_time": "2020-10-12T19:04:50", "upload_time_iso_8601": "2020-10-12T19:04:50.472231Z", "url": "https://files.pythonhosted.org/packages/08/1b/9d6a206cf8fe8c13ed164f2a2dee4a4db6d272cd0a0a3e60106c6cf9840b/continuous_threading-2.0.0.tar.gz", "yanked": false, "yanked_reason": null } ], "2.0.1": [ { "comment_text": "", "digests": { "md5": "d216a41b22f8e66aaba70828d24def0b", "sha256": "62d36ada6279d6281435f46ec17bc8ee66852ba8f3e694e5352353001af2aa8e" }, "downloads": -1, "filename": "continuous_threading-2.0.1-py3-none-any.whl", "has_sig": false, "md5_digest": "d216a41b22f8e66aaba70828d24def0b", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 19045, "upload_time": "2020-11-30T16:16:25", "upload_time_iso_8601": "2020-11-30T16:16:25.004686Z", "url": "https://files.pythonhosted.org/packages/9f/26/d617c089387d454b572be70061bc61291c7ac8f88483d928d9bfbeabfdd6/continuous_threading-2.0.1-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "18fb1ac812480856e7f4145f588542b8", "sha256": "fad0e0910d0dfd338f3fb6ddd2aca7590adef3e596f2564e57d95f452e00820c" }, "downloads": -1, "filename": "continuous_threading-2.0.1.tar.gz", "has_sig": false, "md5_digest": "18fb1ac812480856e7f4145f588542b8", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 19832, "upload_time": "2020-11-30T16:16:26", "upload_time_iso_8601": "2020-11-30T16:16:26.411154Z", "url": "https://files.pythonhosted.org/packages/b6/43/7219009facfe1879b28e9e5f2d25ff7cbde6ffd352f15ef9e817719eae82/continuous_threading-2.0.1.tar.gz", "yanked": false, "yanked_reason": null } ], "2.0.2": [ { "comment_text": "", "digests": { "md5": "e639def87cb69c61ab7c33245505a326", "sha256": "6979a4af0b22e883c4314929c41c8cf37213d311102589f196a8d375a548a0b1" }, "downloads": -1, "filename": "continuous_threading-2.0.2-py3-none-any.whl", "has_sig": false, "md5_digest": "e639def87cb69c61ab7c33245505a326", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 19136, "upload_time": "2020-12-17T22:06:25", "upload_time_iso_8601": "2020-12-17T22:06:25.442947Z", "url": "https://files.pythonhosted.org/packages/b8/44/dfa57311c2dd0e28457808057d28f0a23e020f73821068dd810aff493d08/continuous_threading-2.0.2-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "9d0a1744da4eb7c1c731a6ffcdf636a4", "sha256": "ca27717fb771803edd5500c21e03a9484b4c3aefe86f7e43558f813cda433669" }, "downloads": -1, "filename": "continuous_threading-2.0.2.tar.gz", "has_sig": false, "md5_digest": "9d0a1744da4eb7c1c731a6ffcdf636a4", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 19843, "upload_time": "2020-12-17T22:06:27", "upload_time_iso_8601": "2020-12-17T22:06:27.213036Z", "url": "https://files.pythonhosted.org/packages/6a/19/88a920d49addd3408bf66409a3054660362cbd862cb266d361f5e0a21208/continuous_threading-2.0.2.tar.gz", "yanked": false, "yanked_reason": null } ], "2.0.3": [ { "comment_text": "", "digests": { "md5": "7cb73b5c58bafba28d71d0faa7207dc4", "sha256": "34cd7ffc71b4778d7ad1d04e189fa1883335be82d929384710fe16190ae7b390" }, "downloads": -1, "filename": "continuous_threading-2.0.3-py3-none-any.whl", "has_sig": false, "md5_digest": "7cb73b5c58bafba28d71d0faa7207dc4", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 19158, "upload_time": "2021-03-04T20:47:46", "upload_time_iso_8601": "2021-03-04T20:47:46.887095Z", "url": "https://files.pythonhosted.org/packages/95/f7/27147793127b654930c493f7243b09c382e213ef11e5fcc44aef16daec82/continuous_threading-2.0.3-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "4fccb383c38405e12dab1cb69eaef9e8", "sha256": "727b7938187eef6649150c885e5951328837ceca8f17ea09ea69f76e0b6c60a5" }, "downloads": -1, "filename": "continuous_threading-2.0.3.tar.gz", "has_sig": false, "md5_digest": "4fccb383c38405e12dab1cb69eaef9e8", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 19930, "upload_time": "2021-03-04T20:47:48", "upload_time_iso_8601": "2021-03-04T20:47:48.685266Z", "url": "https://files.pythonhosted.org/packages/43/15/7b7ed33a1e0b223427eb6b632b44275679c1f27a9a313352124617bce7d5/continuous_threading-2.0.3.tar.gz", "yanked": false, "yanked_reason": null } ], "2.0.4": [ { "comment_text": "", "digests": { "md5": "395323e33a205982f7b7b376ff69a293", "sha256": "4b2d40ba20f5473be79e54157b91cffa2b485ca83ebb3983888ece8bbe91f14d" }, "downloads": -1, "filename": "continuous_threading-2.0.4-py3-none-any.whl", "has_sig": false, "md5_digest": "395323e33a205982f7b7b376ff69a293", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 19761, "upload_time": "2021-06-24T14:31:13", "upload_time_iso_8601": "2021-06-24T14:31:13.315438Z", "url": "https://files.pythonhosted.org/packages/ba/2b/d333f483faafe1940701446f8f93897790ef868a877a1e14fb1b9bc21ba2/continuous_threading-2.0.4-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "533cc20b02fd6d0561c6f88ff099458e", "sha256": "b3ffff6c22d26e5682d45fb6c3313a90e58f6b2cea448b7355eb080a7a4870c0" }, "downloads": -1, "filename": "continuous_threading-2.0.4.tar.gz", "has_sig": false, "md5_digest": "533cc20b02fd6d0561c6f88ff099458e", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 20979, "upload_time": "2021-06-24T14:31:15", "upload_time_iso_8601": "2021-06-24T14:31:15.358806Z", "url": "https://files.pythonhosted.org/packages/4b/24/591c618f70cdba16958361b67dff119e711df369eb34394a89714e4d0acb/continuous_threading-2.0.4.tar.gz", "yanked": false, "yanked_reason": null } ], "2.0.5": [ { "comment_text": "", "digests": { "md5": "4dd7b836016b795a68649107acf55bcd", "sha256": "11bd5bb80b5342bda096c63b4dcc7fa1ba442adec7e6b8d9315ba328e1a181d2" }, "downloads": -1, "filename": "continuous_threading-2.0.5-py3-none-any.whl", "has_sig": false, "md5_digest": "4dd7b836016b795a68649107acf55bcd", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 19761, "upload_time": "2022-02-16T17:40:41", "upload_time_iso_8601": "2022-02-16T17:40:41.162717Z", "url": "https://files.pythonhosted.org/packages/65/2f/567f65db26ec8f400db8798ce3cf9d2ea0e8582cbff96aa7711bfb71de65/continuous_threading-2.0.5-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "300371c8ff8d806db4aca7fcf882c205", "sha256": "0997b26ecb5101b4811ae7325cb5425d8fbd784300459e089e3250d3cf32c678" }, "downloads": -1, "filename": "continuous_threading-2.0.5.tar.gz", "has_sig": false, "md5_digest": "300371c8ff8d806db4aca7fcf882c205", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 20971, "upload_time": "2022-02-16T17:40:42", "upload_time_iso_8601": "2022-02-16T17:40:42.683617Z", "url": "https://files.pythonhosted.org/packages/95/c2/90525442c4b1ede9e8ea9f9e3fb7173da3cbf0876b913968e28eea6244bd/continuous_threading-2.0.5.tar.gz", "yanked": false, "yanked_reason": null } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "4dd7b836016b795a68649107acf55bcd", "sha256": "11bd5bb80b5342bda096c63b4dcc7fa1ba442adec7e6b8d9315ba328e1a181d2" }, "downloads": -1, "filename": "continuous_threading-2.0.5-py3-none-any.whl", "has_sig": false, "md5_digest": "4dd7b836016b795a68649107acf55bcd", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 19761, "upload_time": "2022-02-16T17:40:41", "upload_time_iso_8601": "2022-02-16T17:40:41.162717Z", "url": "https://files.pythonhosted.org/packages/65/2f/567f65db26ec8f400db8798ce3cf9d2ea0e8582cbff96aa7711bfb71de65/continuous_threading-2.0.5-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "300371c8ff8d806db4aca7fcf882c205", "sha256": "0997b26ecb5101b4811ae7325cb5425d8fbd784300459e089e3250d3cf32c678" }, "downloads": -1, "filename": "continuous_threading-2.0.5.tar.gz", "has_sig": false, "md5_digest": "300371c8ff8d806db4aca7fcf882c205", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 20971, "upload_time": "2022-02-16T17:40:42", "upload_time_iso_8601": "2022-02-16T17:40:42.683617Z", "url": "https://files.pythonhosted.org/packages/95/c2/90525442c4b1ede9e8ea9f9e3fb7173da3cbf0876b913968e28eea6244bd/continuous_threading-2.0.5.tar.gz", "yanked": false, "yanked_reason": null } ], "vulnerabilities": [] }