diff options
author | Damien George <damien.p.george@gmail.com> | 2016-04-20 14:23:55 +0000 |
---|---|---|
committer | Damien George <damien.p.george@gmail.com> | 2016-06-28 11:09:31 +0100 |
commit | 2d5ea38b4996bec01cabda68b6ef12631a7b7a08 (patch) | |
tree | 968674ad27f0ef01a8f5b4c8b546831ddfa7260b /tests/thread/thread_lock4.py | |
parent | ed36632c6cc227206994cf68b4a4afec2b694e49 (diff) | |
download | micropython-2d5ea38b4996bec01cabda68b6ef12631a7b7a08.tar.gz micropython-2d5ea38b4996bec01cabda68b6ef12631a7b7a08.zip |
tests: Add 3 more tests for _thread module.
Diffstat (limited to 'tests/thread/thread_lock4.py')
-rw-r--r-- | tests/thread/thread_lock4.py | 46 |
1 files changed, 46 insertions, 0 deletions
diff --git a/tests/thread/thread_lock4.py b/tests/thread/thread_lock4.py new file mode 100644 index 0000000000..d77aa24ee8 --- /dev/null +++ b/tests/thread/thread_lock4.py @@ -0,0 +1,46 @@ +# test using lock to coordinate access to global mutable objects +# +# MIT license; Copyright (c) 2016 Damien P. George on behalf of Pycom Ltd + +import _thread + +def fac(n): + x = 1 + for i in range(1, n + 1): + x *= i + return x + +def thread_entry(): + while True: + with jobs_lock: + try: + f, arg = jobs.pop(0) + except IndexError: + return + ans = f(arg) + with output_lock: + output.append((arg, ans)) + +# create a list of jobs +jobs = [(fac, i) for i in range(20, 80)] +jobs_lock = _thread.allocate_lock() +n_jobs = len(jobs) + +# create a list to store the results +output = [] +output_lock = _thread.allocate_lock() + +# spawn threads to do the jobs +for i in range(4): + _thread.start_new_thread(thread_entry, ()) + +# wait for the jobs to complete +while True: + with jobs_lock: + if len(output) == n_jobs: + break + +# sort and print the results +output.sort(key=lambda x: x[0]) +for arg, ans in output: + print(arg, ans) |