aboutsummaryrefslogtreecommitdiffstats
path: root/src/test.py
diff options
context:
space:
mode:
authorMattias Andrée <maandree@operamail.com>2014-03-07 03:50:35 +0100
committerMattias Andrée <maandree@operamail.com>2014-03-07 03:50:35 +0100
commitc7218f0ae8467109cbae599cdd6d9277b7787057 (patch)
tree3cff19e1f5857107f7183a404003536d7e262592 /src/test.py
parentjoin can join many functions (diff)
downloadjoin-python-c7218f0ae8467109cbae599cdd6d9277b7787057.tar.gz
join-python-c7218f0ae8467109cbae599cdd6d9277b7787057.tar.bz2
join-python-c7218f0ae8467109cbae599cdd6d9277b7787057.tar.xz
add unordered join
Signed-off-by: Mattias Andrée <maandree@operamail.com>
Diffstat (limited to '')
-rwxr-xr-xsrc/test.py46
1 files changed, 41 insertions, 5 deletions
diff --git a/src/test.py b/src/test.py
index 2190451..d6e264e 100755
--- a/src/test.py
+++ b/src/test.py
@@ -30,7 +30,7 @@ class signal:
threading.Thread(target = self.f, args = args, kwargs = kwargs).start()
-class joinable:
+class fragment:
def __init__(self, f):
self.f = f
self.queue = []
@@ -42,6 +42,12 @@ class joinable:
self.queue.append((args, kwargs))
self.condition.notify()
self.condition.release()
+
+ def unjoin(self, args, kwargs):
+ self.condition.acquire()
+ self.queue.insert(0, (args, kwargs))
+ self.condition.notify()
+ self.condition.release()
def join(*fs):
@@ -54,21 +60,51 @@ def join(*fs):
return rc[0] if len(fs) == 1 else rc
+def ordered_join(*f_groups):
+ pass
+
+
+def unordered_join(*f_groups):
+ condition = threading.Condition()
+ rc = None
+ index = 0
+ for f_group in f_groups:
+ def join_(fs, index):
+ params = join(*fs)
+ condition.acquire()
+ if rc is None:
+ params = rc
+ condition.release()
+ else:
+ condition.release()
+ if len(fs) == 1:
+ fs[0].unjoin(*params)
+ else:
+ for i, f in enumerate(fs):
+ f.unjoin(*(params[i]))
+ threading.Thread(target = join_, args = (f_group, index)).start()
+ index += 1
+ condition.acquire()
+ condition.wait()
+ condition.release()
+ return rc
+
+
class test:
@signal
def signal(f, *args):
f(*args)
- @joinable
- def joinable(*args, **kwargs):
+ @fragment
+ def fragment(*args, **kwargs):
pass
def join(param):
- (jargs, jkwargs) = join(test.joinable)
+ (jargs, jkwargs) = join(test.fragment)
print(param, dict(jkwargs), *jargs)
test.signal(test.join, 'join')
time.sleep(1)
-test.joinable('arg1', 'arg2', a = 'A', b = 'B')
+test.fragment('arg1', 'arg2', a = 'A', b = 'B')