Skip to content

Instantly share code, notes, and snippets.

@Debilski
Last active December 12, 2015 02:59
Show Gist options
  • Save Debilski/4703685 to your computer and use it in GitHub Desktop.
Save Debilski/4703685 to your computer and use it in GitHub Desktop.
Python (2/3) Actor test
import threading, Queue
Thread = threading.Thread
Empty = Queue.Empty
Queue = Queue.Queue
class Stop(Exception):
pass
class Actor(object):
def __init__(self):
self._proc = Thread(target=self.run)
self._queue = Queue()
def run(self):
while True:
try:
item = self._queue.get(True, 1)
self.do(item)
except Empty:
pass
except Stop:
return
def do(self, item):
pass
def on_start(self):
pass
def start(self):
self.on_start()
self._proc.start()
def put(self, item):
self._queue.put(item)
class Base(Actor):
""" This Actor decreases its retrieved value and sends it to a2."""
def do(self, item):
item -= 1
self.next_actor.put(item)
if item <= 0:
raise Stop()
class PassingActor(Actor):
""" This Actor simply retrieves a value and puts it back to a1."""
def do(self, item):
self.next_actor.put(item)
if item <= 0:
raise Stop()
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('start_val', type=int)
parser.add_argument('num_actors', type=int)
args = parser.parse_args()
START_VAL = args.start_val
NUM_ACTORS = args.num_actors
base = Base()
actors = [PassingActor() for i in range(NUM_ACTORS)]
for a1, a2 in zip([base] + actors, actors + [base]):
a1.next_actor = a2
base.start()
for actor in actors:
actor.start()
base.put(START_VAL)
import sys
if sys.version_info.major == 2:
import threading, Queue
Thread = threading.Thread
Empty = Queue.Empty
Queue = Queue.Queue
else:
import threading, queue
Thread = threading.Thread
Empty = queue.Empty
Queue = queue.Queue
class Stop(Exception):
pass
class Actor(object):
def __init__(self):
self._proc = Thread(target=self.run)
self._queue = Queue()
def run(self):
while True:
try:
item = self._queue.get(True, 1)
self.do(item)
except Empty:
pass
except Stop:
return
def do(self, item):
pass
def on_start(self):
pass
def start(self):
self.on_start()
self._proc.start()
def put(self, item):
self._queue.put(item)
class Base(Actor):
""" This Actor decreases its retrieved value and sends it to a2."""
def do(self, item):
item -= 1
self.next_actor.put(item)
if item <= 0:
raise Stop()
class PassingActor(Actor):
""" This Actor simply retrieves a value and puts it back to a1."""
def do(self, item):
self.next_actor.put(item)
if item <= 0:
raise Stop()
import argparse
import time
parser = argparse.ArgumentParser()
parser.add_argument('start_val', type=int)
parser.add_argument('num_actors', type=int)
args = parser.parse_args()
START_VAL = args.start_val
NUM_ACTORS = args.num_actors
base = Base()
actors = [PassingActor() for i in range(NUM_ACTORS)]
for a1, a2 in zip([base] + actors, actors + [base]):
a1.next_actor = a2
base.start()
for actor in actors:
actor.start()
start_time = time.time()
base.put(START_VAL)
base._proc.join()
for actor in actors:
actor._proc.join()
total_time = time.time() - start_time
print("{total:.4} secs counting from {counts} using using {actors} additional actor(s). ({per_count:.4} secs per count.)".format(
total=total_time,
counts=START_VAL,
actors=NUM_ACTORS,
per_count=total_time/START_VAL))
import threading, queue
Thread = threading.Thread
Empty = queue.Empty
Queue = queue.Queue
class Stop(Exception):
pass
class Actor(object):
def __init__(self):
self._proc = Thread(target=self.run)
self._queue = Queue()
def run(self):
while True:
try:
item = self._queue.get(True, 1)
self.do(item)
except Empty:
pass
except Stop:
return
def do(self, item):
pass
def on_start(self):
pass
def start(self):
self.on_start()
self._proc.start()
def put(self, item):
self._queue.put(item)
class Base(Actor):
""" This Actor decreases its retrieved value and sends it to a2."""
def do(self, item):
item -= 1
self.next_actor.put(item)
if item <= 0:
raise Stop()
class PassingActor(Actor):
""" This Actor simply retrieves a value and puts it back to a1."""
def do(self, item):
self.next_actor.put(item)
if item <= 0:
raise Stop()
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('start_val', type=int)
parser.add_argument('num_actors', type=int)
args = parser.parse_args()
START_VAL = args.start_val
NUM_ACTORS = args.num_actors
base = Base()
actors = [PassingActor() for i in range(NUM_ACTORS)]
for a1, a2 in zip([base] + actors, actors + [base]):
a1.next_actor = a2
base.start()
for actor in actors:
actor.start()
base.put(START_VAL)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment