gilknocker


Namegilknocker JSON
Version 0.4.1 PyPI version JSON
download
home_page
SummaryKnock on the Python GIL, determine how busy it is.
upload_time2023-04-05 08:31:58
maintainer
docs_urlNone
authorMiles Granger <miles59923@gmail.com>
requires_python>=3.7
licenseMIT
keywords gil
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            ## GIL Knocker


`pip install gilknocker`


[![Code Style](https://img.shields.io/badge/code%20style-black-000000.svg)](https://github.com/python/black)
[![CI](https://github.com/milesgranger/gilknocker/actions/workflows/CI.yml/badge.svg?branch=main)](https://github.com/milesgranger/gilknocker/actions/workflows/CI.yml)
[![PyPI](https://img.shields.io/pypi/v/gilknocker.svg)](https://pypi.org/project/gilknocker)
![PyPI - Wheel](https://img.shields.io/pypi/wheel/gilknocker)
[![Downloads](https://pepy.tech/badge/gilknocker/month)](https://pepy.tech/project/gilknocker)


When you thought the GIL was available, and you find yourself suspecting it might be spending time
with another. 

You probably want [py-spy](https://github.com/benfred/py-spy), however if you're
looking for a quick-and-dirty way to slip in a GIL contention metric within a specific
chunk of code, this might help you.

### How?

Unfortunately, there doesn't appear to be any explicit C-API for checking how busy
the GIL is. [PyGILState_Check](https://docs.python.org/3/c-api/init.html#c.PyGILState_Check) 
won't really work, that's limited to the current thread. 
[PyInterpreterState](https://docs.python.org/3/c-api/init.html#c.PyGILState_Check) 
is an opaque struct, and the [PyRuntimeState](https://github.com/python/cpython/blob/main/Include/internal/pycore_pystate.h)
and other goodies are private in CPython.

So, in ~200 lines of Rusty code, I've conjured up a basic metric that seems 
to align with what is reported by `py-spy` when running the same [test case](./tests/test_knockknock.py).
This works by spawning a thread which, at regular intervals, re-acquires the GIL and checks 
how long it took for the GIL to answer.

Note, the `polling_interval_micros`, `sampling_interval_micros`, and `sleeping_interval_micros` 
are configurable. 

- `polling_interval_micros`
  - How frequently to re-acquire the GIL and measure how long it took to acquire. The more frequent, the
    more likely the contention metric will represent accurate GIL contention. A good value for this is 1-1000.

- `sampling_interval_micros`
  - How _long_ to run the polling routine. If this is 1ms, then for 1ms it will try to re-acquire the GIL 
    at `polling_interval_micros` frequency. Defaults to 10x `sampling_interval_micros`

- `sleeping_interval_micros`
  - How long to sleep between sampling routines. Defaults to 100x `polling_interval_micros`


### Use

Look at the [tests](./tests)

```python

from gilknocker import KnockKnock

# These two are equivalent. 
knocker = KnockKnock(1_000) 
knocker = KnockKnock(
  polling_interval_micros=1_000, 
  sampling_interval_micros=10_000, 
  sleeping_interval_micros=100_000
)
knocker.start()

... smart code here ...

knocker.contention_metric  # float between 0-1 indicating roughly how busy the GIL was.
knocker.reset_contention_metric()  # reset timers and meteric calculation

... some more smart code ...

knocker.stop()
knocker.stop()  # Idempodent stopping behavior

knocker.contention_metric  # will stay the same after `stop()` is called.

knocker.is_running  # If you're ever in doubt

```

### How will this impact my program?

Short answer, it depends, but probably not much. As stated above, the more frequent the 
polling and sampling interval, the more likely non-GIL bound programs will be affected, since there is 
more room for contention. In GIL heavy programs, the monitoring thread will spend most of its 
time simply waiting for a lock. This is demonstrated in the [benchmarks](./benchmarks) testing.

In general, it appears that `polling_interval_micros=1_000` is a good tradeoff in terms of accurate
GIL contention metric and the resulting `sampling_interval_micros=10_000` (defaults to 10x polling interval)
is high enough to relax performance impact a bit when combined with `sleeping_interval_micros=100_000` 
(defaults to 100x polling interval); but feel free to play with these to conform to your needs.

Below is a summary of benchmarking two different 
functions, one which uses the GIL, and one which releases it. For `interval=None` this means 
no polling was used, effectively just running the function without `gilknocker`. Otherwise, 
the interval represents the value passed to `KnockKnock(polling_interval_micros=interval)`

`python -m pytest -v --benchmark-only benchmarks/ --benchmark-histogram`

```
------------------------------------------------------------------------------------ benchmark: 18 tests -------------------------------------------------------------------------------------
Name (time in s)                       Min               Max              Mean            StdDev            Median               IQR            Outliers     OPS            Rounds  Iterations
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
test_bench[a_little_gil-100000]     1.5368 (2.07)     1.6596 (2.23)     1.5968 (2.14)     0.0476 (130.12)   1.5943 (2.14)     0.0719 (140.14)        2;0  0.6262 (0.47)          5           1
test_bench[a_little_gil-10000]      1.5321 (2.06)     1.5989 (2.14)     1.5618 (2.09)     0.0289 (78.95)    1.5610 (2.09)     0.0510 (99.52)         2;0  0.6403 (0.48)          5           1
test_bench[a_little_gil-1000]       1.5246 (2.05)     1.5298 (2.05)     1.5271 (2.05)     0.0019 (5.12)     1.5269 (2.05)     0.0021 (4.00)          2;0  0.6549 (0.49)          5           1
test_bench[a_little_gil-100]        1.5505 (2.09)     1.5543 (2.08)     1.5528 (2.08)     0.0014 (3.96)     1.5533 (2.08)     0.0018 (3.60)          2;0  0.6440 (0.48)          5           1
test_bench[a_little_gil-10]         1.5863 (2.13)     1.6074 (2.16)     1.5928 (2.14)     0.0088 (23.94)    1.5896 (2.13)     0.0111 (21.60)         1;0  0.6278 (0.47)          5           1
test_bench[a_little_gil-None]       1.5043 (2.02)     1.5067 (2.02)     1.5051 (2.02)     0.0011 (2.95)     1.5044 (2.02)     0.0016 (3.17)          1;0  0.6644 (0.50)          5           1
test_bench[a_lotta_gil-100000]      0.7450 (1.00)     0.7458 (1.0)      0.7455 (1.0)      0.0004 (1.0)      0.7457 (1.0)      0.0005 (1.0)           1;0  1.3413 (1.0)           5           1
test_bench[a_lotta_gil-10000]       0.7471 (1.00)     0.8104 (1.09)     0.7601 (1.02)     0.0281 (76.94)    0.7472 (1.00)     0.0168 (32.82)         1;1  1.3156 (0.98)          5           1
test_bench[a_lotta_gil-1000]        0.7436 (1.0)      0.7472 (1.00)     0.7463 (1.00)     0.0015 (4.11)     0.7470 (1.00)     0.0013 (2.54)          1;1  1.3400 (1.00)          5           1
test_bench[a_lotta_gil-100]         0.7558 (1.02)     0.7680 (1.03)     0.7640 (1.02)     0.0050 (13.56)    0.7644 (1.03)     0.0061 (11.97)         1;0  1.3089 (0.98)          5           1
test_bench[a_lotta_gil-10]          0.7542 (1.01)     0.7734 (1.04)     0.7649 (1.03)     0.0084 (23.05)    0.7669 (1.03)     0.0151 (29.45)         2;0  1.3074 (0.97)          5           1
test_bench[a_lotta_gil-None]        0.7437 (1.00)     0.8490 (1.14)     0.8006 (1.07)     0.0501 (137.15)   0.8074 (1.08)     0.0969 (189.03)        1;0  1.2490 (0.93)          5           1
test_bench[some_gil-100000]         1.4114 (1.90)     1.4131 (1.89)     1.4122 (1.89)     0.0007 (1.81)     1.4121 (1.89)     0.0010 (2.00)          2;0  0.7081 (0.53)          5           1
test_bench[some_gil-10000]          1.4115 (1.90)     1.4258 (1.91)     1.4167 (1.90)     0.0059 (16.03)    1.4141 (1.90)     0.0083 (16.19)         1;0  0.7058 (0.53)          5           1
test_bench[some_gil-1000]           1.4169 (1.91)     1.5793 (2.12)     1.4618 (1.96)     0.0690 (188.82)   1.4232 (1.91)     0.0769 (150.04)        1;0  0.6841 (0.51)          5           1
test_bench[some_gil-100]            1.4468 (1.95)     1.6261 (2.18)     1.5701 (2.11)     0.0752 (205.83)   1.5998 (2.15)     0.1004 (195.70)        1;0  0.6369 (0.47)          5           1
test_bench[some_gil-10]             1.5269 (2.05)     1.9894 (2.67)     1.7037 (2.29)     0.1895 (518.49)   1.7301 (2.32)     0.2692 (524.96)        1;0  0.5870 (0.44)          5           1
test_bench[some_gil-None]           1.4115 (1.90)     1.4267 (1.91)     1.4155 (1.90)     0.0063 (17.33)    1.4136 (1.90)     0.0053 (10.24)         1;1  0.7065 (0.53)          5           1
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
```

![](./benchmarks/histogram.svg)

---

### License

[Unlicense](LICENSE) or [MIT](LICENSE-MIT), at your discretion.


            

Raw data

            {
    "_id": null,
    "home_page": "",
    "name": "gilknocker",
    "maintainer": "",
    "docs_url": null,
    "requires_python": ">=3.7",
    "maintainer_email": "",
    "keywords": "GIL",
    "author": "Miles Granger <miles59923@gmail.com>",
    "author_email": "Miles Granger <miles59923@gmail.com>",
    "download_url": "https://files.pythonhosted.org/packages/49/7a/03b79a537b98ad71b9522d72df7e357097e13db4e08dc45b8328fe1442db/gilknocker-0.4.1.tar.gz",
    "platform": null,
    "description": "## GIL Knocker\n\n\n`pip install gilknocker`\n\n\n[![Code Style](https://img.shields.io/badge/code%20style-black-000000.svg)](https://github.com/python/black)\n[![CI](https://github.com/milesgranger/gilknocker/actions/workflows/CI.yml/badge.svg?branch=main)](https://github.com/milesgranger/gilknocker/actions/workflows/CI.yml)\n[![PyPI](https://img.shields.io/pypi/v/gilknocker.svg)](https://pypi.org/project/gilknocker)\n![PyPI - Wheel](https://img.shields.io/pypi/wheel/gilknocker)\n[![Downloads](https://pepy.tech/badge/gilknocker/month)](https://pepy.tech/project/gilknocker)\n\n\nWhen you thought the GIL was available, and you find yourself suspecting it might be spending time\nwith another. \n\nYou probably want [py-spy](https://github.com/benfred/py-spy), however if you're\nlooking for a quick-and-dirty way to slip in a GIL contention metric within a specific\nchunk of code, this might help you.\n\n### How?\n\nUnfortunately, there doesn't appear to be any explicit C-API for checking how busy\nthe GIL is. [PyGILState_Check](https://docs.python.org/3/c-api/init.html#c.PyGILState_Check) \nwon't really work, that's limited to the current thread. \n[PyInterpreterState](https://docs.python.org/3/c-api/init.html#c.PyGILState_Check) \nis an opaque struct, and the [PyRuntimeState](https://github.com/python/cpython/blob/main/Include/internal/pycore_pystate.h)\nand other goodies are private in CPython.\n\nSo, in ~200 lines of Rusty code, I've conjured up a basic metric that seems \nto align with what is reported by `py-spy` when running the same [test case](./tests/test_knockknock.py).\nThis works by spawning a thread which, at regular intervals, re-acquires the GIL and checks \nhow long it took for the GIL to answer.\n\nNote, the `polling_interval_micros`, `sampling_interval_micros`, and `sleeping_interval_micros` \nare configurable. \n\n- `polling_interval_micros`\n  - How frequently to re-acquire the GIL and measure how long it took to acquire. The more frequent, the\n    more likely the contention metric will represent accurate GIL contention. A good value for this is 1-1000.\n\n- `sampling_interval_micros`\n  - How _long_ to run the polling routine. If this is 1ms, then for 1ms it will try to re-acquire the GIL \n    at `polling_interval_micros` frequency. Defaults to 10x `sampling_interval_micros`\n\n- `sleeping_interval_micros`\n  - How long to sleep between sampling routines. Defaults to 100x `polling_interval_micros`\n\n\n### Use\n\nLook at the [tests](./tests)\n\n```python\n\nfrom gilknocker import KnockKnock\n\n# These two are equivalent. \nknocker = KnockKnock(1_000) \nknocker = KnockKnock(\n  polling_interval_micros=1_000, \n  sampling_interval_micros=10_000, \n  sleeping_interval_micros=100_000\n)\nknocker.start()\n\n... smart code here ...\n\nknocker.contention_metric  # float between 0-1 indicating roughly how busy the GIL was.\nknocker.reset_contention_metric()  # reset timers and meteric calculation\n\n... some more smart code ...\n\nknocker.stop()\nknocker.stop()  # Idempodent stopping behavior\n\nknocker.contention_metric  # will stay the same after `stop()` is called.\n\nknocker.is_running  # If you're ever in doubt\n\n```\n\n### How will this impact my program?\n\nShort answer, it depends, but probably not much. As stated above, the more frequent the \npolling and sampling interval, the more likely non-GIL bound programs will be affected, since there is \nmore room for contention. In GIL heavy programs, the monitoring thread will spend most of its \ntime simply waiting for a lock. This is demonstrated in the [benchmarks](./benchmarks) testing.\n\nIn general, it appears that `polling_interval_micros=1_000` is a good tradeoff in terms of accurate\nGIL contention metric and the resulting `sampling_interval_micros=10_000` (defaults to 10x polling interval)\nis high enough to relax performance impact a bit when combined with `sleeping_interval_micros=100_000` \n(defaults to 100x polling interval); but feel free to play with these to conform to your needs.\n\nBelow is a summary of benchmarking two different \nfunctions, one which uses the GIL, and one which releases it. For `interval=None` this means \nno polling was used, effectively just running the function without `gilknocker`. Otherwise, \nthe interval represents the value passed to `KnockKnock(polling_interval_micros=interval)`\n\n`python -m pytest -v --benchmark-only benchmarks/ --benchmark-histogram`\n\n```\n------------------------------------------------------------------------------------ benchmark: 18 tests -------------------------------------------------------------------------------------\nName (time in s)                       Min               Max              Mean            StdDev            Median               IQR            Outliers     OPS            Rounds  Iterations\n----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------\ntest_bench[a_little_gil-100000]     1.5368 (2.07)     1.6596 (2.23)     1.5968 (2.14)     0.0476 (130.12)   1.5943 (2.14)     0.0719 (140.14)        2;0  0.6262 (0.47)          5           1\ntest_bench[a_little_gil-10000]      1.5321 (2.06)     1.5989 (2.14)     1.5618 (2.09)     0.0289 (78.95)    1.5610 (2.09)     0.0510 (99.52)         2;0  0.6403 (0.48)          5           1\ntest_bench[a_little_gil-1000]       1.5246 (2.05)     1.5298 (2.05)     1.5271 (2.05)     0.0019 (5.12)     1.5269 (2.05)     0.0021 (4.00)          2;0  0.6549 (0.49)          5           1\ntest_bench[a_little_gil-100]        1.5505 (2.09)     1.5543 (2.08)     1.5528 (2.08)     0.0014 (3.96)     1.5533 (2.08)     0.0018 (3.60)          2;0  0.6440 (0.48)          5           1\ntest_bench[a_little_gil-10]         1.5863 (2.13)     1.6074 (2.16)     1.5928 (2.14)     0.0088 (23.94)    1.5896 (2.13)     0.0111 (21.60)         1;0  0.6278 (0.47)          5           1\ntest_bench[a_little_gil-None]       1.5043 (2.02)     1.5067 (2.02)     1.5051 (2.02)     0.0011 (2.95)     1.5044 (2.02)     0.0016 (3.17)          1;0  0.6644 (0.50)          5           1\ntest_bench[a_lotta_gil-100000]      0.7450 (1.00)     0.7458 (1.0)      0.7455 (1.0)      0.0004 (1.0)      0.7457 (1.0)      0.0005 (1.0)           1;0  1.3413 (1.0)           5           1\ntest_bench[a_lotta_gil-10000]       0.7471 (1.00)     0.8104 (1.09)     0.7601 (1.02)     0.0281 (76.94)    0.7472 (1.00)     0.0168 (32.82)         1;1  1.3156 (0.98)          5           1\ntest_bench[a_lotta_gil-1000]        0.7436 (1.0)      0.7472 (1.00)     0.7463 (1.00)     0.0015 (4.11)     0.7470 (1.00)     0.0013 (2.54)          1;1  1.3400 (1.00)          5           1\ntest_bench[a_lotta_gil-100]         0.7558 (1.02)     0.7680 (1.03)     0.7640 (1.02)     0.0050 (13.56)    0.7644 (1.03)     0.0061 (11.97)         1;0  1.3089 (0.98)          5           1\ntest_bench[a_lotta_gil-10]          0.7542 (1.01)     0.7734 (1.04)     0.7649 (1.03)     0.0084 (23.05)    0.7669 (1.03)     0.0151 (29.45)         2;0  1.3074 (0.97)          5           1\ntest_bench[a_lotta_gil-None]        0.7437 (1.00)     0.8490 (1.14)     0.8006 (1.07)     0.0501 (137.15)   0.8074 (1.08)     0.0969 (189.03)        1;0  1.2490 (0.93)          5           1\ntest_bench[some_gil-100000]         1.4114 (1.90)     1.4131 (1.89)     1.4122 (1.89)     0.0007 (1.81)     1.4121 (1.89)     0.0010 (2.00)          2;0  0.7081 (0.53)          5           1\ntest_bench[some_gil-10000]          1.4115 (1.90)     1.4258 (1.91)     1.4167 (1.90)     0.0059 (16.03)    1.4141 (1.90)     0.0083 (16.19)         1;0  0.7058 (0.53)          5           1\ntest_bench[some_gil-1000]           1.4169 (1.91)     1.5793 (2.12)     1.4618 (1.96)     0.0690 (188.82)   1.4232 (1.91)     0.0769 (150.04)        1;0  0.6841 (0.51)          5           1\ntest_bench[some_gil-100]            1.4468 (1.95)     1.6261 (2.18)     1.5701 (2.11)     0.0752 (205.83)   1.5998 (2.15)     0.1004 (195.70)        1;0  0.6369 (0.47)          5           1\ntest_bench[some_gil-10]             1.5269 (2.05)     1.9894 (2.67)     1.7037 (2.29)     0.1895 (518.49)   1.7301 (2.32)     0.2692 (524.96)        1;0  0.5870 (0.44)          5           1\ntest_bench[some_gil-None]           1.4115 (1.90)     1.4267 (1.91)     1.4155 (1.90)     0.0063 (17.33)    1.4136 (1.90)     0.0053 (10.24)         1;1  0.7065 (0.53)          5           1\n----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n```\n\n![](./benchmarks/histogram.svg)\n\n---\n\n### License\n\n[Unlicense](LICENSE) or [MIT](LICENSE-MIT), at your discretion.\n\n",
    "bugtrack_url": null,
    "license": "MIT",
    "summary": "Knock on the Python GIL, determine how busy it is.",
    "version": "0.4.1",
    "split_keywords": [
        "gil"
    ],
    "urls": [
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "085b987578840388b12dcd3ec0b9cd5972b0904dd28dd0bcb86272a26e1b9600",
                "md5": "c41ea1882fd062df5e962a949881afb5",
                "sha256": "094ee864032e54fafa8e0c87edf62ccc70fcc6322bea76ddf890e9564d1b758e"
            },
            "downloads": -1,
            "filename": "gilknocker-0.4.1-cp310-cp310-macosx_10_7_x86_64.whl",
            "has_sig": false,
            "md5_digest": "c41ea1882fd062df5e962a949881afb5",
            "packagetype": "bdist_wheel",
            "python_version": "cp310",
            "requires_python": ">=3.7",
            "size": 274791,
            "upload_time": "2023-04-05T08:31:16",
            "upload_time_iso_8601": "2023-04-05T08:31:16.303007Z",
            "url": "https://files.pythonhosted.org/packages/08/5b/987578840388b12dcd3ec0b9cd5972b0904dd28dd0bcb86272a26e1b9600/gilknocker-0.4.1-cp310-cp310-macosx_10_7_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "5ebbd109aa03dd6416d590892f0b9b85720165197c38aac580015776a70a5f29",
                "md5": "07f3ec06eda3dce68beee69300330214",
                "sha256": "50450a1adf10df257dc68baf9c67437b26e1b85914a79e2b5e7b7c1ae8542dcc"
            },
            "downloads": -1,
            "filename": "gilknocker-0.4.1-cp310-cp310-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl",
            "has_sig": false,
            "md5_digest": "07f3ec06eda3dce68beee69300330214",
            "packagetype": "bdist_wheel",
            "python_version": "cp310",
            "requires_python": ">=3.7",
            "size": 533037,
            "upload_time": "2023-04-05T08:31:18",
            "upload_time_iso_8601": "2023-04-05T08:31:18.034690Z",
            "url": "https://files.pythonhosted.org/packages/5e/bb/d109aa03dd6416d590892f0b9b85720165197c38aac580015776a70a5f29/gilknocker-0.4.1-cp310-cp310-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "e89a3380ee80148d29811410dd433c80f925633a0675f9b9d54bdf5265fd2185",
                "md5": "c6e9c445bd03c9b4f48c21935fc5d946",
                "sha256": "2421eb3723c32be4f6f1896a8a54a0e761cab3347b236a02b542478f700b8a62"
            },
            "downloads": -1,
            "filename": "gilknocker-0.4.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl",
            "has_sig": false,
            "md5_digest": "c6e9c445bd03c9b4f48c21935fc5d946",
            "packagetype": "bdist_wheel",
            "python_version": "cp310",
            "requires_python": ">=3.7",
            "size": 632180,
            "upload_time": "2023-04-05T08:31:19",
            "upload_time_iso_8601": "2023-04-05T08:31:19.122968Z",
            "url": "https://files.pythonhosted.org/packages/e8/9a/3380ee80148d29811410dd433c80f925633a0675f9b9d54bdf5265fd2185/gilknocker-0.4.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "fa2ddff96152c4891c5d56e35d38446afe4cf68b8435e71ab0f2072874cbc5fe",
                "md5": "484a53b34a20d13a2f145adc85893cfb",
                "sha256": "1ba6a363be7994631bc497c33d26f9782d72db4d7e75ba0c08db20d04204c3fd"
            },
            "downloads": -1,
            "filename": "gilknocker-0.4.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "has_sig": false,
            "md5_digest": "484a53b34a20d13a2f145adc85893cfb",
            "packagetype": "bdist_wheel",
            "python_version": "cp310",
            "requires_python": ">=3.7",
            "size": 613331,
            "upload_time": "2023-04-05T08:31:20",
            "upload_time_iso_8601": "2023-04-05T08:31:20.433453Z",
            "url": "https://files.pythonhosted.org/packages/fa/2d/dff96152c4891c5d56e35d38446afe4cf68b8435e71ab0f2072874cbc5fe/gilknocker-0.4.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "5c892378ba46b827d4dc0f3f90ff4c957511583f5dc4802236e5d5814dcec145",
                "md5": "bc19bfd26f4e184e1e417506d0c2b8b5",
                "sha256": "8aae0a07bf76de63d2adf299e3a342e03dad11df3b8cea65f0c2e74411824dae"
            },
            "downloads": -1,
            "filename": "gilknocker-0.4.1-cp310-none-win32.whl",
            "has_sig": false,
            "md5_digest": "bc19bfd26f4e184e1e417506d0c2b8b5",
            "packagetype": "bdist_wheel",
            "python_version": "cp310",
            "requires_python": ">=3.7",
            "size": 154889,
            "upload_time": "2023-04-05T08:31:22",
            "upload_time_iso_8601": "2023-04-05T08:31:22.235354Z",
            "url": "https://files.pythonhosted.org/packages/5c/89/2378ba46b827d4dc0f3f90ff4c957511583f5dc4802236e5d5814dcec145/gilknocker-0.4.1-cp310-none-win32.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "b52ee9474028df7d018fdeabfaa53b5c3bc4166207cfa5b5a5b68d4e1b03dd18",
                "md5": "ede54f865fba4569e916149d1b1a5aeb",
                "sha256": "34446b914b2831df22594ea24179bb55897f48b93a2efcf9b869cd01aad5f3bd"
            },
            "downloads": -1,
            "filename": "gilknocker-0.4.1-cp310-none-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "ede54f865fba4569e916149d1b1a5aeb",
            "packagetype": "bdist_wheel",
            "python_version": "cp310",
            "requires_python": ">=3.7",
            "size": 162695,
            "upload_time": "2023-04-05T08:31:23",
            "upload_time_iso_8601": "2023-04-05T08:31:23.781691Z",
            "url": "https://files.pythonhosted.org/packages/b5/2e/e9474028df7d018fdeabfaa53b5c3bc4166207cfa5b5a5b68d4e1b03dd18/gilknocker-0.4.1-cp310-none-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "28ad8643f2fca13934d64244c61127cc5eca80bea5d407bda9b04b8f0f2c761b",
                "md5": "f02561074e48384e8e50b79a6e54ef0f",
                "sha256": "0a291450033eb9c404ba0b80fd5f522bfe9bf1805a23f88bd665abc32587ac39"
            },
            "downloads": -1,
            "filename": "gilknocker-0.4.1-cp311-cp311-macosx_10_7_x86_64.whl",
            "has_sig": false,
            "md5_digest": "f02561074e48384e8e50b79a6e54ef0f",
            "packagetype": "bdist_wheel",
            "python_version": "cp311",
            "requires_python": ">=3.7",
            "size": 274789,
            "upload_time": "2023-04-05T08:31:24",
            "upload_time_iso_8601": "2023-04-05T08:31:24.775470Z",
            "url": "https://files.pythonhosted.org/packages/28/ad/8643f2fca13934d64244c61127cc5eca80bea5d407bda9b04b8f0f2c761b/gilknocker-0.4.1-cp311-cp311-macosx_10_7_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "068b0aa8ed71ecf01a1008cf41526e5041c68bc8fd63faf392d87695632cb8eb",
                "md5": "20ae5ac539104d8d452dcead967382de",
                "sha256": "66a4eb863229e8f99a867ca7ef57e34f9e757ca3599b4e4e554795370cfb30a6"
            },
            "downloads": -1,
            "filename": "gilknocker-0.4.1-cp311-cp311-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl",
            "has_sig": false,
            "md5_digest": "20ae5ac539104d8d452dcead967382de",
            "packagetype": "bdist_wheel",
            "python_version": "cp311",
            "requires_python": ">=3.7",
            "size": 533031,
            "upload_time": "2023-04-05T08:31:26",
            "upload_time_iso_8601": "2023-04-05T08:31:26.422935Z",
            "url": "https://files.pythonhosted.org/packages/06/8b/0aa8ed71ecf01a1008cf41526e5041c68bc8fd63faf392d87695632cb8eb/gilknocker-0.4.1-cp311-cp311-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "55912083c80ba690c7604e40170d5764523095e5022681d4c34394426fc5964b",
                "md5": "71313d2c80b71b63e71b040cb5c623d8",
                "sha256": "90ddf44dde01578801a7fb52421766c7e0dde343b2b220f97f3f3f1f05c4e604"
            },
            "downloads": -1,
            "filename": "gilknocker-0.4.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.whl",
            "has_sig": false,
            "md5_digest": "71313d2c80b71b63e71b040cb5c623d8",
            "packagetype": "bdist_wheel",
            "python_version": "cp311",
            "requires_python": ">=3.7",
            "size": 632177,
            "upload_time": "2023-04-05T08:31:28",
            "upload_time_iso_8601": "2023-04-05T08:31:28.056289Z",
            "url": "https://files.pythonhosted.org/packages/55/91/2083c80ba690c7604e40170d5764523095e5022681d4c34394426fc5964b/gilknocker-0.4.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "ced9fddceebc2ea8410677e4c3865607332fed2c623d74671c84076f612a05e3",
                "md5": "ea3e21a817abee708a70d9bdbe9df3fc",
                "sha256": "de32005922d3d8044835dcb2374761b96abc7498e8e1510e13e4c052ac0d545e"
            },
            "downloads": -1,
            "filename": "gilknocker-0.4.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "has_sig": false,
            "md5_digest": "ea3e21a817abee708a70d9bdbe9df3fc",
            "packagetype": "bdist_wheel",
            "python_version": "cp311",
            "requires_python": ">=3.7",
            "size": 613331,
            "upload_time": "2023-04-05T08:31:29",
            "upload_time_iso_8601": "2023-04-05T08:31:29.087057Z",
            "url": "https://files.pythonhosted.org/packages/ce/d9/fddceebc2ea8410677e4c3865607332fed2c623d74671c84076f612a05e3/gilknocker-0.4.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "6730a4ac7e21f87a651ba142caffc80d0e71c9dbe21e2e2dcc527dfde7b0fb6a",
                "md5": "b3a95d32bf8d57de4f3381a07ad467c4",
                "sha256": "d2818d2945d019c94a8853e42b930afb3d27aab2674636792f77ed32fedcae4b"
            },
            "downloads": -1,
            "filename": "gilknocker-0.4.1-cp311-none-win32.whl",
            "has_sig": false,
            "md5_digest": "b3a95d32bf8d57de4f3381a07ad467c4",
            "packagetype": "bdist_wheel",
            "python_version": "cp311",
            "requires_python": ">=3.7",
            "size": 154886,
            "upload_time": "2023-04-05T08:31:30",
            "upload_time_iso_8601": "2023-04-05T08:31:30.681068Z",
            "url": "https://files.pythonhosted.org/packages/67/30/a4ac7e21f87a651ba142caffc80d0e71c9dbe21e2e2dcc527dfde7b0fb6a/gilknocker-0.4.1-cp311-none-win32.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "566eceff9daefe21564e9115030fa522b1abdc45a7ecd883da35b84160f9b8d4",
                "md5": "3ed732022da0963c56d0e2dc9239d88b",
                "sha256": "b433f8aea88fa001475b644afb44e8932ec44362282e5ad76d21ee1ef4b9ea8f"
            },
            "downloads": -1,
            "filename": "gilknocker-0.4.1-cp311-none-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "3ed732022da0963c56d0e2dc9239d88b",
            "packagetype": "bdist_wheel",
            "python_version": "cp311",
            "requires_python": ">=3.7",
            "size": 162696,
            "upload_time": "2023-04-05T08:31:32",
            "upload_time_iso_8601": "2023-04-05T08:31:32.244122Z",
            "url": "https://files.pythonhosted.org/packages/56/6e/ceff9daefe21564e9115030fa522b1abdc45a7ecd883da35b84160f9b8d4/gilknocker-0.4.1-cp311-none-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "26acfaea38c3243dddf7a452b7a5ba06243ecf7c348ba65a4dad0285e3ea6c96",
                "md5": "b17251df00a8b2ad2552757ac3e9f46b",
                "sha256": "f987a0c37f0b44eb4f45051ab33cb0c5ae1381bdfacffdb06c89b28bab03a409"
            },
            "downloads": -1,
            "filename": "gilknocker-0.4.1-cp37-cp37m-macosx_10_7_x86_64.whl",
            "has_sig": false,
            "md5_digest": "b17251df00a8b2ad2552757ac3e9f46b",
            "packagetype": "bdist_wheel",
            "python_version": "cp37",
            "requires_python": ">=3.7",
            "size": 275497,
            "upload_time": "2023-04-05T08:31:33",
            "upload_time_iso_8601": "2023-04-05T08:31:33.315479Z",
            "url": "https://files.pythonhosted.org/packages/26/ac/faea38c3243dddf7a452b7a5ba06243ecf7c348ba65a4dad0285e3ea6c96/gilknocker-0.4.1-cp37-cp37m-macosx_10_7_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "82e4f06a95ed0b3cbbae91e0c8595d78a73174e6d7d55ea45f9c67eb9bb3564a",
                "md5": "fbac45cc58cdce8f108d571b85f00bc2",
                "sha256": "8e2436acccdf75bb8622d35ea5af693d2fdcc9e63567a8424af6e863973a917f"
            },
            "downloads": -1,
            "filename": "gilknocker-0.4.1-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.whl",
            "has_sig": false,
            "md5_digest": "fbac45cc58cdce8f108d571b85f00bc2",
            "packagetype": "bdist_wheel",
            "python_version": "cp37",
            "requires_python": ">=3.7",
            "size": 632836,
            "upload_time": "2023-04-05T08:31:34",
            "upload_time_iso_8601": "2023-04-05T08:31:34.413169Z",
            "url": "https://files.pythonhosted.org/packages/82/e4/f06a95ed0b3cbbae91e0c8595d78a73174e6d7d55ea45f9c67eb9bb3564a/gilknocker-0.4.1-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "eed1dc910f8b7507de4389772dda85fd7a9b80c3cbc9b8b0ce14478cce23f946",
                "md5": "5ef14b9d63e459e2cb5481f67d1ac4d9",
                "sha256": "9ff2f4b7e09efb3aa316ecc3d6df7df1c8d50053919e5c8e933ddc85aa932148"
            },
            "downloads": -1,
            "filename": "gilknocker-0.4.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "has_sig": false,
            "md5_digest": "5ef14b9d63e459e2cb5481f67d1ac4d9",
            "packagetype": "bdist_wheel",
            "python_version": "cp37",
            "requires_python": ">=3.7",
            "size": 613762,
            "upload_time": "2023-04-05T08:31:36",
            "upload_time_iso_8601": "2023-04-05T08:31:36.678890Z",
            "url": "https://files.pythonhosted.org/packages/ee/d1/dc910f8b7507de4389772dda85fd7a9b80c3cbc9b8b0ce14478cce23f946/gilknocker-0.4.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "750b592055a63c9a7c95483e226c8ef769677ace60b0cfac5a7f06b4bc9be096",
                "md5": "315ee0113778e6549ea6b222b4514c37",
                "sha256": "c228837d176cbc601ee30962c9b79d1336ed350f7ac7ef67dc889afb09eb1979"
            },
            "downloads": -1,
            "filename": "gilknocker-0.4.1-cp37-none-win32.whl",
            "has_sig": false,
            "md5_digest": "315ee0113778e6549ea6b222b4514c37",
            "packagetype": "bdist_wheel",
            "python_version": "cp37",
            "requires_python": ">=3.7",
            "size": 155315,
            "upload_time": "2023-04-05T08:31:38",
            "upload_time_iso_8601": "2023-04-05T08:31:38.220201Z",
            "url": "https://files.pythonhosted.org/packages/75/0b/592055a63c9a7c95483e226c8ef769677ace60b0cfac5a7f06b4bc9be096/gilknocker-0.4.1-cp37-none-win32.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "6cdfeca18cee2653fec4c110e8147731e55a5c6d1ab02489d6c7acc902016347",
                "md5": "dac8dff2351a1245c3091a91b1948ba5",
                "sha256": "0f929bb718bde531608f9da9317d0e06bcc6b64d78021c1ba43782f0ab02d763"
            },
            "downloads": -1,
            "filename": "gilknocker-0.4.1-cp37-none-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "dac8dff2351a1245c3091a91b1948ba5",
            "packagetype": "bdist_wheel",
            "python_version": "cp37",
            "requires_python": ">=3.7",
            "size": 163113,
            "upload_time": "2023-04-05T08:31:39",
            "upload_time_iso_8601": "2023-04-05T08:31:39.798742Z",
            "url": "https://files.pythonhosted.org/packages/6c/df/eca18cee2653fec4c110e8147731e55a5c6d1ab02489d6c7acc902016347/gilknocker-0.4.1-cp37-none-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "0ab01933fcf956e978452af445287096acbfab195fd7060a2d41ffe8bbd635f8",
                "md5": "309d1d80ce71925fd95d3f3a903bf0b9",
                "sha256": "a83d4a1fb1501c45ac1c7f6fec55b2f7ad6efea4c1f31504055f2b7bac62792a"
            },
            "downloads": -1,
            "filename": "gilknocker-0.4.1-cp38-cp38-macosx_10_7_x86_64.whl",
            "has_sig": false,
            "md5_digest": "309d1d80ce71925fd95d3f3a903bf0b9",
            "packagetype": "bdist_wheel",
            "python_version": "cp38",
            "requires_python": ">=3.7",
            "size": 275451,
            "upload_time": "2023-04-05T08:31:40",
            "upload_time_iso_8601": "2023-04-05T08:31:40.837230Z",
            "url": "https://files.pythonhosted.org/packages/0a/b0/1933fcf956e978452af445287096acbfab195fd7060a2d41ffe8bbd635f8/gilknocker-0.4.1-cp38-cp38-macosx_10_7_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "b8c0ab2c1930c598b6906e5bd2dfe9a87f1c77f964acee1cb00d51f42ba7454d",
                "md5": "9ac23a701edc63c4b5da2c282c6a47ab",
                "sha256": "7a37ad5f0ea74627a2adf392e7d1ff5930c44275a47e65e2853719a43c441707"
            },
            "downloads": -1,
            "filename": "gilknocker-0.4.1-cp38-cp38-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl",
            "has_sig": false,
            "md5_digest": "9ac23a701edc63c4b5da2c282c6a47ab",
            "packagetype": "bdist_wheel",
            "python_version": "cp38",
            "requires_python": ">=3.7",
            "size": 534461,
            "upload_time": "2023-04-05T08:31:41",
            "upload_time_iso_8601": "2023-04-05T08:31:41.956171Z",
            "url": "https://files.pythonhosted.org/packages/b8/c0/ab2c1930c598b6906e5bd2dfe9a87f1c77f964acee1cb00d51f42ba7454d/gilknocker-0.4.1-cp38-cp38-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "d2b371c08de83e7a17ae73807d568d72d4390a232daae39178b64d988dbcd0ef",
                "md5": "07ad9f0770cd6300c96dd6ab27728922",
                "sha256": "9b9d43848f015e95d6f1645f52d96e5994efbb96456c57161acb164adbdc53d9"
            },
            "downloads": -1,
            "filename": "gilknocker-0.4.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl",
            "has_sig": false,
            "md5_digest": "07ad9f0770cd6300c96dd6ab27728922",
            "packagetype": "bdist_wheel",
            "python_version": "cp38",
            "requires_python": ">=3.7",
            "size": 632849,
            "upload_time": "2023-04-05T08:31:43",
            "upload_time_iso_8601": "2023-04-05T08:31:43.523854Z",
            "url": "https://files.pythonhosted.org/packages/d2/b3/71c08de83e7a17ae73807d568d72d4390a232daae39178b64d988dbcd0ef/gilknocker-0.4.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "890acff63e0d98c83a36e7c708443e6ad3c6dfb2a8440785ba35052deb269171",
                "md5": "6f5368f3d818ef8b6d7b9eb4f11735e8",
                "sha256": "2288fbb606c457b3103306c9e72f124782ccc7a48b1fff5dd0b0ea379f2ee6cc"
            },
            "downloads": -1,
            "filename": "gilknocker-0.4.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "has_sig": false,
            "md5_digest": "6f5368f3d818ef8b6d7b9eb4f11735e8",
            "packagetype": "bdist_wheel",
            "python_version": "cp38",
            "requires_python": ">=3.7",
            "size": 613698,
            "upload_time": "2023-04-05T08:31:45",
            "upload_time_iso_8601": "2023-04-05T08:31:45.388099Z",
            "url": "https://files.pythonhosted.org/packages/89/0a/cff63e0d98c83a36e7c708443e6ad3c6dfb2a8440785ba35052deb269171/gilknocker-0.4.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "3c7c9d1ea49cc2b2059acaca3d32ccfa48b5c8efa453ee9e14d39ee386e12008",
                "md5": "a9fe715d62639f81759c989e534d1b0c",
                "sha256": "b2a56dec5155968c12b9463c662b1cfaec87329ba59b6bbba4944907e6e7bb10"
            },
            "downloads": -1,
            "filename": "gilknocker-0.4.1-cp38-none-win32.whl",
            "has_sig": false,
            "md5_digest": "a9fe715d62639f81759c989e534d1b0c",
            "packagetype": "bdist_wheel",
            "python_version": "cp38",
            "requires_python": ">=3.7",
            "size": 155284,
            "upload_time": "2023-04-05T08:31:47",
            "upload_time_iso_8601": "2023-04-05T08:31:47.934360Z",
            "url": "https://files.pythonhosted.org/packages/3c/7c/9d1ea49cc2b2059acaca3d32ccfa48b5c8efa453ee9e14d39ee386e12008/gilknocker-0.4.1-cp38-none-win32.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "4929016eaf2427584544a3deefed4f6300caf85bdf8c45ebac4bc8c6ecc9e713",
                "md5": "271c71e3e1d77f68657cf063afb9a21b",
                "sha256": "9e82fcb264663edcf4d2478d929be873c3633ea339fe676a915b1f468499b39a"
            },
            "downloads": -1,
            "filename": "gilknocker-0.4.1-cp38-none-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "271c71e3e1d77f68657cf063afb9a21b",
            "packagetype": "bdist_wheel",
            "python_version": "cp38",
            "requires_python": ">=3.7",
            "size": 163133,
            "upload_time": "2023-04-05T08:31:49",
            "upload_time_iso_8601": "2023-04-05T08:31:49.707486Z",
            "url": "https://files.pythonhosted.org/packages/49/29/016eaf2427584544a3deefed4f6300caf85bdf8c45ebac4bc8c6ecc9e713/gilknocker-0.4.1-cp38-none-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "d75f5c627a4f9a6892f7237437f748a7e08c2868e8c8dc173a44ce4a10a2aa03",
                "md5": "662772299821801b147f1f48980bd427",
                "sha256": "ca95db3f4a73d60cfbfecdea6aacea9a10931ae8bfe010db70bad214eebad55c"
            },
            "downloads": -1,
            "filename": "gilknocker-0.4.1-cp39-cp39-macosx_10_7_x86_64.whl",
            "has_sig": false,
            "md5_digest": "662772299821801b147f1f48980bd427",
            "packagetype": "bdist_wheel",
            "python_version": "cp39",
            "requires_python": ">=3.7",
            "size": 275191,
            "upload_time": "2023-04-05T08:31:50",
            "upload_time_iso_8601": "2023-04-05T08:31:50.813578Z",
            "url": "https://files.pythonhosted.org/packages/d7/5f/5c627a4f9a6892f7237437f748a7e08c2868e8c8dc173a44ce4a10a2aa03/gilknocker-0.4.1-cp39-cp39-macosx_10_7_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "bd8edd8fd6a6aeebbb45bec877c8fbbfa29135277bb757c1bb8f4a435062f6d2",
                "md5": "31f5d3ecc03ba68f9663ff0252ffeb43",
                "sha256": "8b38a0e2f9231e7324c832099dcad3ec4c2f5b3a48105ba8e1d2496cf245feb0"
            },
            "downloads": -1,
            "filename": "gilknocker-0.4.1-cp39-cp39-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl",
            "has_sig": false,
            "md5_digest": "31f5d3ecc03ba68f9663ff0252ffeb43",
            "packagetype": "bdist_wheel",
            "python_version": "cp39",
            "requires_python": ">=3.7",
            "size": 533941,
            "upload_time": "2023-04-05T08:31:51",
            "upload_time_iso_8601": "2023-04-05T08:31:51.894433Z",
            "url": "https://files.pythonhosted.org/packages/bd/8e/dd8fd6a6aeebbb45bec877c8fbbfa29135277bb757c1bb8f4a435062f6d2/gilknocker-0.4.1-cp39-cp39-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "25bf48f4a0be6549bf7e4ea83ff5273f226b190f9b006e6a2d15b492116e98c2",
                "md5": "67bfe7c005649a01ac9d3a945b27b6fa",
                "sha256": "8e6386b21256a3ab35d97df9f151b716278ee3f6e99ca2b4b587bb43d60d1516"
            },
            "downloads": -1,
            "filename": "gilknocker-0.4.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl",
            "has_sig": false,
            "md5_digest": "67bfe7c005649a01ac9d3a945b27b6fa",
            "packagetype": "bdist_wheel",
            "python_version": "cp39",
            "requires_python": ">=3.7",
            "size": 632589,
            "upload_time": "2023-04-05T08:31:53",
            "upload_time_iso_8601": "2023-04-05T08:31:53.507784Z",
            "url": "https://files.pythonhosted.org/packages/25/bf/48f4a0be6549bf7e4ea83ff5273f226b190f9b006e6a2d15b492116e98c2/gilknocker-0.4.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "34d4ee3c0d07e5b3f6f2745d04c5bf5af48ad605fc56375faa2573ca56f7afb2",
                "md5": "3e46c29d943b7a64d63f22d403309d49",
                "sha256": "c2bc4daceb5934cecfec12c703ebe584528f2af57ef475697d7d3d50ce0e1757"
            },
            "downloads": -1,
            "filename": "gilknocker-0.4.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "has_sig": false,
            "md5_digest": "3e46c29d943b7a64d63f22d403309d49",
            "packagetype": "bdist_wheel",
            "python_version": "cp39",
            "requires_python": ">=3.7",
            "size": 613495,
            "upload_time": "2023-04-05T08:31:54",
            "upload_time_iso_8601": "2023-04-05T08:31:54.579461Z",
            "url": "https://files.pythonhosted.org/packages/34/d4/ee3c0d07e5b3f6f2745d04c5bf5af48ad605fc56375faa2573ca56f7afb2/gilknocker-0.4.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "83325e2bcd0200e77c52eaedc1eeb633368c25e458348b6f3c8baaad4618f329",
                "md5": "d522208b2e56fedeff95196f6944c064",
                "sha256": "f0c87669639439c5073ad4aae30ea70c00f2567f56cf8623f43a7062217a732c"
            },
            "downloads": -1,
            "filename": "gilknocker-0.4.1-cp39-none-win32.whl",
            "has_sig": false,
            "md5_digest": "d522208b2e56fedeff95196f6944c064",
            "packagetype": "bdist_wheel",
            "python_version": "cp39",
            "requires_python": ">=3.7",
            "size": 155100,
            "upload_time": "2023-04-05T08:31:55",
            "upload_time_iso_8601": "2023-04-05T08:31:55.632583Z",
            "url": "https://files.pythonhosted.org/packages/83/32/5e2bcd0200e77c52eaedc1eeb633368c25e458348b6f3c8baaad4618f329/gilknocker-0.4.1-cp39-none-win32.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "a9adda29d5eb78a1626077e6c1a87f4cff61f86382ba9e0f3b379228cb9661fd",
                "md5": "2f9523cde3ae6aa45332f6d916a407c8",
                "sha256": "d0636b90a0256c2b3e7fa58deb8e7d55e6a1fe90133c2715fec47a26b999d366"
            },
            "downloads": -1,
            "filename": "gilknocker-0.4.1-cp39-none-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "2f9523cde3ae6aa45332f6d916a407c8",
            "packagetype": "bdist_wheel",
            "python_version": "cp39",
            "requires_python": ">=3.7",
            "size": 162971,
            "upload_time": "2023-04-05T08:31:56",
            "upload_time_iso_8601": "2023-04-05T08:31:56.788140Z",
            "url": "https://files.pythonhosted.org/packages/a9/ad/da29d5eb78a1626077e6c1a87f4cff61f86382ba9e0f3b379228cb9661fd/gilknocker-0.4.1-cp39-none-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "497a03b79a537b98ad71b9522d72df7e357097e13db4e08dc45b8328fe1442db",
                "md5": "eff26a25b7fcf79cd87e77268d582c5c",
                "sha256": "0a9ce42b50221e8ea9572e28847ec46a1a527124a25e6f6f7a0f1d2668c9241c"
            },
            "downloads": -1,
            "filename": "gilknocker-0.4.1.tar.gz",
            "has_sig": false,
            "md5_digest": "eff26a25b7fcf79cd87e77268d582c5c",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.7",
            "size": 26813,
            "upload_time": "2023-04-05T08:31:58",
            "upload_time_iso_8601": "2023-04-05T08:31:58.468535Z",
            "url": "https://files.pythonhosted.org/packages/49/7a/03b79a537b98ad71b9522d72df7e357097e13db4e08dc45b8328fe1442db/gilknocker-0.4.1.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2023-04-05 08:31:58",
    "github": false,
    "gitlab": false,
    "bitbucket": false,
    "lcname": "gilknocker"
}
        
Elapsed time: 0.21132s