Created
June 18, 2015 14:26
-
-
Save prologic/7bb5bbcecfb79bfdc841 to your computer and use it in GitHub Desktop.
Naive implemtnation of Pool/map in circuits
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/env python | |
"""Bridge Example | |
A Bridge example ... | |
""" | |
from __future__ import print_function | |
import sys | |
from time import sleep | |
from itertools import repeat | |
from operator import attrgetter | |
from circuits import child, Event, Component, Debugger | |
class main(Event): | |
"""main Event""" | |
class isprime(Event): | |
"""isprime Event""" | |
class emap(Event): | |
"""emap Event""" | |
class Worker(Component): | |
def isprime(self, x): | |
sleep(0.1) | |
if x in [0, 1]: | |
return False | |
for n in xrange(2, int(x ** 0.5 + 1)): | |
if x % n == 0: | |
return False | |
return True | |
getresult = attrgetter("result") | |
getvalue = attrgetter("value") | |
class Pool(Component): | |
def init(self): | |
self.workers = [] | |
def add(self, worker): | |
self.workers.append(worker.start(process=True, link=self)) | |
def emap(self, event, e, xs): | |
vs = [] | |
while xs: | |
for process, worker in self.workers: | |
if xs: | |
vs.append(self.fire(child(e(xs.pop())), worker.channel)) | |
while not all(map(getresult, vs)): | |
yield | |
yield map(getvalue, vs) | |
class App(Component): | |
def init(self, *args): | |
Debugger(events=False).register(self) | |
n = args and int(args[0]) or 2 | |
self.pool = Pool().register(self) | |
for _ in repeat(None, n): | |
self.pool.add(Worker()) | |
self.fire(main()) | |
def main(self): | |
xs = yield self.call(emap(isprime, range(100))) | |
print(xs) | |
raise SystemExit(0) | |
App(*sys.argv[1:]).run() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Demo: