diff options
| author | Mattias Andrée <maandree@operamail.com> | 2014-03-07 03:50:35 +0100 |
|---|---|---|
| committer | Mattias Andrée <maandree@operamail.com> | 2014-03-07 03:50:35 +0100 |
| commit | c7218f0ae8467109cbae599cdd6d9277b7787057 (patch) | |
| tree | 3cff19e1f5857107f7183a404003536d7e262592 /src | |
| parent | join can join many functions (diff) | |
| download | join-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-x | src/test.py | 46 |
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') |
