# %%
from multiprocessing import Pool, Process
import hashlib
from random import random
from time import time
import concurrent.futures
start_time = time()
workers = 1
def compute(z):
id = z
print('Start id =', id)
for cnt in range(10):
ar = [hashlib.md5(b'%s' % bytes(i)) for i in range(30000)]
print(cnt, 'id =', id)
print('Finish id =', id)
ids = [random(), random(), random(),random(), random(), random(),random(), random(), random(),]
# %%
# We can use a with statement to ensure threads are cleaned up promptly
with concurrent.futures.ThreadPoolExecutor(max_workers=workers) as executor:
# Start the load operations and mark each future with its URL
future_to_url = {executor.submit(compute, url): url for url in ids}
print('after future')
for future in concurrent.futures.as_completed(future_to_url):
url = future_to_url[future]
try:
data = future.result()
except Exception as exc:
print('Exception' % (url, exc))
else:
print('Finished', url)
print('All done. Time taken ', round(time() - start_time, 3), ', Workers ', workers)
'''
# Python 3.6 buggy
All done. Time taken 45.307 , Workers 1
All done. Time taken 32.062 , Workers 2
All done. Time taken 27.553 , Workers 3
All done. Time taken 38.718 , Workers 4
All done. Time taken 40.013 , Workers 4
All done. Time taken 47.477 , Workers 5
All done. Time taken 45.283 , Workers 9
All done. Time taken 45.413 , Workers 12
All done. Time taken 43.496 , Workers 12
All done. Time taken 45.294 , Workers 12
All done. Time taken 45.059 , Workers None
# Python 3.8
All done. Time taken 48.34 , Workers 12
All done. Time taken 42.096 , Workers 4
All done. Time taken 40.636 , Workers 4
All done. Time taken 30.949 , Workers 3
All done. Time taken 31.034 , Workers 2
All done. Time taken 48.932 , Workers 1
'''
# %%
IyAlJQpmcm9tIG11bHRpcHJvY2Vzc2luZyBpbXBvcnQgUG9vbCwgUHJvY2VzcwppbXBvcnQgaGFzaGxpYgpmcm9tIHJhbmRvbSBpbXBvcnQgcmFuZG9tCmZyb20gdGltZSBpbXBvcnQgdGltZQppbXBvcnQgY29uY3VycmVudC5mdXR1cmVzCgoKc3RhcnRfdGltZSA9IHRpbWUoKQp3b3JrZXJzID0gMQpkZWYgY29tcHV0ZSh6KToKICAgIGlkID0gegogICAgcHJpbnQoJ1N0YXJ0IGlkID0nLCBpZCkKICAgIGZvciBjbnQgaW4gcmFuZ2UoMTApOgogICAgICAgIGFyID0gW2hhc2hsaWIubWQ1KGInJXMnICUgYnl0ZXMoaSkpIGZvciBpIGluIHJhbmdlKDMwMDAwKV0KICAgICAgICBwcmludChjbnQsICdpZCA9JywgaWQpCiAgICBwcmludCgnRmluaXNoIGlkID0nLCBpZCkKCgoKaWRzID0gW3JhbmRvbSgpLCByYW5kb20oKSwgcmFuZG9tKCkscmFuZG9tKCksIHJhbmRvbSgpLCByYW5kb20oKSxyYW5kb20oKSwgcmFuZG9tKCksIHJhbmRvbSgpLF0KCiMgJSUKCiMgV2UgY2FuIHVzZSBhIHdpdGggc3RhdGVtZW50IHRvIGVuc3VyZSB0aHJlYWRzIGFyZSBjbGVhbmVkIHVwIHByb21wdGx5CndpdGggY29uY3VycmVudC5mdXR1cmVzLlRocmVhZFBvb2xFeGVjdXRvcihtYXhfd29ya2Vycz13b3JrZXJzKSBhcyBleGVjdXRvcjoKICAgICMgU3RhcnQgdGhlIGxvYWQgb3BlcmF0aW9ucyBhbmQgbWFyayBlYWNoIGZ1dHVyZSB3aXRoIGl0cyBVUkwKICAgIGZ1dHVyZV90b191cmwgPSB7ZXhlY3V0b3Iuc3VibWl0KGNvbXB1dGUsIHVybCk6IHVybCBmb3IgdXJsIGluIGlkc30KICAgIHByaW50KCdhZnRlciBmdXR1cmUnKQogICAgZm9yIGZ1dHVyZSBpbiBjb25jdXJyZW50LmZ1dHVyZXMuYXNfY29tcGxldGVkKGZ1dHVyZV90b191cmwpOgogICAgICAgIHVybCA9IGZ1dHVyZV90b191cmxbZnV0dXJlXQogICAgICAgIHRyeToKICAgICAgICAgICAgZGF0YSA9IGZ1dHVyZS5yZXN1bHQoKQogICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZXhjOgogICAgICAgICAgICBwcmludCgnRXhjZXB0aW9uJyAlICh1cmwsIGV4YykpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcHJpbnQoJ0ZpbmlzaGVkJywgdXJsKQoKCnByaW50KCdBbGwgZG9uZS4gVGltZSB0YWtlbiAnLCByb3VuZCh0aW1lKCkgLSBzdGFydF90aW1lLCAzKSwgJywgV29ya2VycyAnLCB3b3JrZXJzKQoKJycnCiMgUHl0aG9uIDMuNiBidWdneQpBbGwgZG9uZS4gVGltZSB0YWtlbiAgNDUuMzA3ICwgV29ya2VycyAgMQpBbGwgZG9uZS4gVGltZSB0YWtlbiAgMzIuMDYyICwgV29ya2VycyAgMgpBbGwgZG9uZS4gVGltZSB0YWtlbiAgMjcuNTUzICwgV29ya2VycyAgMwpBbGwgZG9uZS4gVGltZSB0YWtlbiAgMzguNzE4ICwgV29ya2VycyAgNApBbGwgZG9uZS4gVGltZSB0YWtlbiAgNDAuMDEzICwgV29ya2VycyAgNApBbGwgZG9uZS4gVGltZSB0YWtlbiAgNDcuNDc3ICwgV29ya2VycyAgNQpBbGwgZG9uZS4gVGltZSB0YWtlbiAgNDUuMjgzICwgV29ya2VycyAgOQpBbGwgZG9uZS4gVGltZSB0YWtlbiAgNDUuNDEzICwgV29ya2VycyAgMTIKQWxsIGRvbmUuIFRpbWUgdGFrZW4gIDQzLjQ5NiAsIFdvcmtlcnMgIDEyCkFsbCBkb25lLiBUaW1lIHRha2VuICA0NS4yOTQgLCBXb3JrZXJzICAxMgpBbGwgZG9uZS4gVGltZSB0YWtlbiAgNDUuMDU5ICwgV29ya2VycyAgTm9uZQoKIyBQeXRob24gMy44CkFsbCBkb25lLiBUaW1lIHRha2VuICA0OC4zNCAsIFdvcmtlcnMgIDEyCkFsbCBkb25lLiBUaW1lIHRha2VuICA0Mi4wOTYgLCBXb3JrZXJzICA0CkFsbCBkb25lLiBUaW1lIHRha2VuICA0MC42MzYgLCBXb3JrZXJzICA0CkFsbCBkb25lLiBUaW1lIHRha2VuICAzMC45NDkgLCBXb3JrZXJzICAzCkFsbCBkb25lLiBUaW1lIHRha2VuICAzMS4wMzQgLCBXb3JrZXJzICAyCkFsbCBkb25lLiBUaW1lIHRha2VuICA0OC45MzIgLCBXb3JrZXJzICAxCgonJycKIyAlJQo=