summaryrefslogtreecommitdiffstatshomepage
path: root/tests/thread/thread_lock4.py
diff options
context:
space:
mode:
Diffstat (limited to 'tests/thread/thread_lock4.py')
-rw-r--r--tests/thread/thread_lock4.py46
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)