# Thread batch with timeout - return values in dict
1) import threadingbatch
2) add the decorator @threadingbatch.thread_capture to your function
3) add \*args, \*\*kwargs to your function
4) create a list of lists with all function calls
5) call threadingbatch.start_all_threads
6) get the results from threadingbatch.results
```python
$ pip install threadingbatch
from kthread_sleep import sleep # killing might not work with time.sleep ( pip install kthread-sleep )
import threadingbatch
import random
@threadingbatch.thread_capture # The threaded function must be decorated
def test(
testnumber, *args, **kwargs
): # a threaded function must have *args, **kwargs and can't have the keyword argument _starttime
print(f"start {testnumber}")
sleep(1)
v = random.randrange(1, 30)
print(f"end {testnumber}")
return v
flist = []
for ini, k in enumerate(range(20)): # creating 20 function calls
flist.append(
[
test, # function
(), # args
{"testnumber": ini}, # kwargs
f"function_{str(ini)}", # key in threadingbatch.results (must be unique and type str), the key can't have the name "done"
]
)
flistt = threadingbatch.start_all_threads(
flist,
threadtlimit=5, # number of simultaneously executed threads
timeout=4, # call Kthread.kill after n seconds
sleepafterkill=0.02, # sleep time after calling Kthread.kill
sleepafterstart=0.02, # sleep time after starting a thread
ignore_exceptions=False,
verbose=False,
)
while not threadingbatch.results[
"done"
]: # when all threads are done, threadingbatch.results['done'] changes to True
pass
sleep(0.1)
# output:
# start 0
# start 1
# start 2
# start 3
# start 4
# start 5
# end 0
# start 6
# end 1
# start 7
# end 2
# start 8
# end 3
# ....
print(threadingbatch.results)
# defaultdict(<function threadingbatch.<lambda>()>,
# {'done': True,
# 'function_19': defaultdict(<function threadingbatch.<lambda>()>,
# {'results': 11, 'realstart': 1673158006.740858}),
# 'function_18': defaultdict(<function threadingbatch.<lambda>()>,
# {'results': 23, 'realstart': 1673158006.4810376}),
# 'function_17': defaultdict(<function threadingbatch.<lambda>()>,
# {'results': 14, 'realstart': 1673158005.2808566}),
# 'function_16': defaultdict(<function threadingbatch.<lambda>()>,
# {'results': 1, 'realstart': 1673158005.1208546}),
# 'function_15': defaultdict(<function threadingbatch.<lambda>()>,
# {'results': 4, 'realstart': 1673158005.0807495}),
# 'function_14': defaultdict(<function threadingbatch.<lambda>()>,
# {'results': 23, 'realstart': 1673158004.7609262}),
# 'function_13': defaultdict(<function threadingbatch.<lambda>()>,
# {'results': 15, 'realstart': 1673158004.7207859}),
# 'function_12': defaultdict(<function threadingbatch.<lambda>()>,
# {'results': 4, 'realstart': 1673158004.5210721}),
# 'function_11': defaultdict(<function threadingbatch.<lambda>()>,
# {'results': 15, 'realstart': 1673158002.9808593}),
# 'function_10': defaultdict(<function threadingbatch.<lambda>()>,
# {'results': 4, 'realstart': 1673158002.941067}),
# 'function_9': defaultdict(<function threadingbatch.<lambda>()>,
# {'results': 20, 'realstart': 1673158002.9007895}),
# 'function_8': defaultdict(<function threadingbatch.<lambda>()>,
# {'results': 29, 'realstart': 1673158002.420729}),
# 'function_7': defaultdict(<function threadingbatch.<lambda>()>,
# {'results': 6, 'realstart': 1673158002.3609126}),
# 'function_6': defaultdict(<function threadingbatch.<lambda>()>,
# {'results': 16, 'realstart': 1673158002.3207767}),
# 'function_5': defaultdict(<function threadingbatch.<lambda>()>,
# {'results': 1, 'realstart': 1673158000.5775528}),
# 'function_4': defaultdict(<function threadingbatch.<lambda>()>,
# {'results': 18, 'realstart': 1673158000.5409462}),
# 'function_3': defaultdict(<function threadingbatch.<lambda>()>,
# {'results': 23, 'realstart': 1673158000.5010219}),
# 'function_2': defaultdict(<function threadingbatch.<lambda>()>,
# {'results': 14, 'realstart': 1673158000.4609187}),
# 'function_1': defaultdict(<function threadingbatch.<lambda>()>,
# {'results': 10, 'realstart': 1673158000.420832}),
# 'function_0': defaultdict(<function threadingbatch.<lambda>()>,
# {'results': 12, 'realstart': 1673158000.370694})})
```
Raw data
{
"_id": null,
"home_page": "https://github.com/hansalemaos/threadingbatch",
"name": "threadingbatch",
"maintainer": "",
"docs_url": null,
"requires_python": "",
"maintainer_email": "",
"keywords": "threads,kill,batch,timeout,return",
"author": "Johannes Fischer",
"author_email": "<aulasparticularesdealemaosp@gmail.com>",
"download_url": "https://files.pythonhosted.org/packages/6b/de/49d92d81647a70e5930d1469ae70dc4db0f2b807e74874abafb067819c04/threadingbatch-0.10.tar.gz",
"platform": null,
"description": "\n# Thread batch with timeout - return values in dict \n\n\n1) import\u00a0threadingbatch\n2) add the decorator\u00a0@threadingbatch.thread_capture to your function\n3) add \\*args, \\*\\*kwargs to your function\n4) create a list of lists with all function calls\u00a0\n5) call\u00a0threadingbatch.start_all_threads\n6) get the results from\u00a0threadingbatch.results\n\n```python\n$ pip install threadingbatch\nfrom kthread_sleep import sleep # killing might not work with time.sleep ( pip install kthread-sleep )\nimport threadingbatch\nimport random\n\n\n@threadingbatch.thread_capture # The threaded function must be decorated\ndef test(\n testnumber, *args, **kwargs\n): # a threaded function must have *args, **kwargs and can't have the keyword argument _starttime\n\n print(f\"start {testnumber}\")\n sleep(1)\n v = random.randrange(1, 30)\n print(f\"end {testnumber}\")\n return v\n\n\nflist = []\nfor ini, k in enumerate(range(20)): # creating 20 function calls\n\n flist.append(\n [\n test, # function\n (), # args\n {\"testnumber\": ini}, # kwargs\n f\"function_{str(ini)}\", # key in threadingbatch.results (must be unique and type str), the key can't have the name \"done\"\n ]\n )\nflistt = threadingbatch.start_all_threads(\n flist,\n threadtlimit=5, # number of simultaneously executed threads\n timeout=4, # call Kthread.kill after n seconds\n sleepafterkill=0.02, # sleep time after calling Kthread.kill\n sleepafterstart=0.02, # sleep time after starting a thread\n ignore_exceptions=False,\n verbose=False,\n)\n\nwhile not threadingbatch.results[\n \"done\"\n]: # when all threads are done, threadingbatch.results['done'] changes to True\n\n pass\n sleep(0.1)\n\n# output:\n# start 0\n# start 1\n# start 2\n# start 3\n# start 4\n# start 5\n# end 0\n# start 6\n# end 1\n# start 7\n# end 2\n# start 8\n# end 3\n# ....\n\nprint(threadingbatch.results)\n# defaultdict(<function threadingbatch.<lambda>()>,\n# {'done': True,\n# 'function_19': defaultdict(<function threadingbatch.<lambda>()>,\n# {'results': 11, 'realstart': 1673158006.740858}),\n# 'function_18': defaultdict(<function threadingbatch.<lambda>()>,\n# {'results': 23, 'realstart': 1673158006.4810376}),\n# 'function_17': defaultdict(<function threadingbatch.<lambda>()>,\n# {'results': 14, 'realstart': 1673158005.2808566}),\n# 'function_16': defaultdict(<function threadingbatch.<lambda>()>,\n# {'results': 1, 'realstart': 1673158005.1208546}),\n# 'function_15': defaultdict(<function threadingbatch.<lambda>()>,\n# {'results': 4, 'realstart': 1673158005.0807495}),\n# 'function_14': defaultdict(<function threadingbatch.<lambda>()>,\n# {'results': 23, 'realstart': 1673158004.7609262}),\n# 'function_13': defaultdict(<function threadingbatch.<lambda>()>,\n# {'results': 15, 'realstart': 1673158004.7207859}),\n# 'function_12': defaultdict(<function threadingbatch.<lambda>()>,\n# {'results': 4, 'realstart': 1673158004.5210721}),\n# 'function_11': defaultdict(<function threadingbatch.<lambda>()>,\n# {'results': 15, 'realstart': 1673158002.9808593}),\n# 'function_10': defaultdict(<function threadingbatch.<lambda>()>,\n# {'results': 4, 'realstart': 1673158002.941067}),\n# 'function_9': defaultdict(<function threadingbatch.<lambda>()>,\n# {'results': 20, 'realstart': 1673158002.9007895}),\n# 'function_8': defaultdict(<function threadingbatch.<lambda>()>,\n# {'results': 29, 'realstart': 1673158002.420729}),\n# 'function_7': defaultdict(<function threadingbatch.<lambda>()>,\n# {'results': 6, 'realstart': 1673158002.3609126}),\n# 'function_6': defaultdict(<function threadingbatch.<lambda>()>,\n# {'results': 16, 'realstart': 1673158002.3207767}),\n# 'function_5': defaultdict(<function threadingbatch.<lambda>()>,\n# {'results': 1, 'realstart': 1673158000.5775528}),\n# 'function_4': defaultdict(<function threadingbatch.<lambda>()>,\n# {'results': 18, 'realstart': 1673158000.5409462}),\n# 'function_3': defaultdict(<function threadingbatch.<lambda>()>,\n# {'results': 23, 'realstart': 1673158000.5010219}),\n# 'function_2': defaultdict(<function threadingbatch.<lambda>()>,\n# {'results': 14, 'realstart': 1673158000.4609187}),\n# 'function_1': defaultdict(<function threadingbatch.<lambda>()>,\n# {'results': 10, 'realstart': 1673158000.420832}),\n# 'function_0': defaultdict(<function threadingbatch.<lambda>()>,\n# {'results': 12, 'realstart': 1673158000.370694})})\n\n\n\n```\n\n\n\n",
"bugtrack_url": null,
"license": "MIT",
"summary": "Thread batch with timeout - return values in dict",
"version": "0.10",
"split_keywords": [
"threads",
"kill",
"batch",
"timeout",
"return"
],
"urls": [
{
"comment_text": "",
"digests": {
"blake2b_256": "bb1eecc7e9a0c0102e278ddfea97dd6ee195712a9d7a5707343433169d86623f",
"md5": "74b3ae33a911d37575392a3538752ecc",
"sha256": "0f8b3037663ef0701317a246dc17ec16dbb9fa7d8113498a14e33912d6562726"
},
"downloads": -1,
"filename": "threadingbatch-0.10-py3-none-any.whl",
"has_sig": false,
"md5_digest": "74b3ae33a911d37575392a3538752ecc",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": null,
"size": 7245,
"upload_time": "2023-01-08T06:55:15",
"upload_time_iso_8601": "2023-01-08T06:55:15.169358Z",
"url": "https://files.pythonhosted.org/packages/bb/1e/ecc7e9a0c0102e278ddfea97dd6ee195712a9d7a5707343433169d86623f/threadingbatch-0.10-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "6bde49d92d81647a70e5930d1469ae70dc4db0f2b807e74874abafb067819c04",
"md5": "b65172f03ffb620bc3cae7a6663cab37",
"sha256": "c8c663a0711e8a045ae08f9f98dba12ee2d06e11d796baceec59b531ffccbcf8"
},
"downloads": -1,
"filename": "threadingbatch-0.10.tar.gz",
"has_sig": false,
"md5_digest": "b65172f03ffb620bc3cae7a6663cab37",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 6022,
"upload_time": "2023-01-08T06:55:16",
"upload_time_iso_8601": "2023-01-08T06:55:16.673870Z",
"url": "https://files.pythonhosted.org/packages/6b/de/49d92d81647a70e5930d1469ae70dc4db0f2b807e74874abafb067819c04/threadingbatch-0.10.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2023-01-08 06:55:16",
"github": true,
"gitlab": false,
"bitbucket": false,
"github_user": "hansalemaos",
"github_project": "threadingbatch",
"travis_ci": false,
"coveralls": false,
"github_actions": false,
"requirements": [],
"lcname": "threadingbatch"
}