diff options
Diffstat (limited to 'src/test.py')
| -rwxr-xr-x | src/test.py | 141 |
1 files changed, 0 insertions, 141 deletions
diff --git a/src/test.py b/src/test.py deleted file mode 100755 index a864e18..0000000 --- a/src/test.py +++ /dev/null @@ -1,141 +0,0 @@ -#!/usr/bin/python3 -# -*- python -*- -''' -join python – Join-calculus for Python -Copyright © 2014 Mattias Andrée (maandree@member.fsf.org) - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program. If not, see <http://www.gnu.org/licenses/>. -''' - -import time - -import random -import threading - - -class signal: - def __init__(self, f): - self.f = f - - def __call__(self, *args, **kwargs): - class signal_: - def __init__(self, f): - def f_(): - self.rc = f(*args, **kwargs) - self.rc = None - self.t = threading.Thread(target = f_) - self.t.start() - def join(self): - self.t.join() - return self.rc - return signal_(self.f) - - -class fragment: - def __init__(self, f): - self.f = f - self.queue = [] - self.condition = threading.Condition() - - def __call__(self, *args, **kwargs): - self.f(*args, **kwargs) - self.condition.acquire() - 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): - rc = [] - for f in fs: - f.condition.acquire() - f.condition.wait() - rc.append(f.queue.pop(0)) - f.condition.release() - return rc[0] if len(fs) == 1 else rc - - -def ordered_join(*f_groups): - condition = threading.Condition() - rc = None - index = 0 - for f_group in f_groups: - def join_(fs, index): - params = join(*fs) - already_done = rc is not None - if not already_done: - condition.acquire() - if rc is None: - params = (index, rc) - condition.notify() - condition.release() - else: - if not already_done: - 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 - - -def unordered_join(*f_groups): - ready = [i for i, fs in enumerate(f_groups) if all([len(f.queue) for f in fs])] - if len(ready): - i = ready[random.randrange(len(ready))] - return (i, join(*(f_groups[i]))) - else: - return ordered_join(*f_groups) - - -def concurrently(*fs): - ts = [threading.Thread(target = f, args = args, kwargs = kwargs) for f in fs] - for t in ts: - ts.start() - for t in ts: - ts.join() - - -class test: - @signal - def signal(f, *args): - f(*args) - return 'test' - - @fragment - def fragment(*args, **kwargs): - pass - - def join(param): - (jargs, jkwargs) = join(test.fragment) - print(param, dict(jkwargs), *jargs) - - -s = test.signal(test.join, 'join') -time.sleep(1) -test.fragment('arg1', 'arg2', a = 'A', b = 'B') -print(s.join()) - |
