asynchronous events with multithreading and multiprocessing withcircuits

J

James Mills

Hi folks,

For those interested, I have just completed implementing
multiprocessing support for circuits (1). It has historically
always had multithreading support. These components
can be found in circuits.workers and are called:
Thread and Process

The reason these exist is to perform "work", ie: long-running
and potentially blocking tasks that should not be handled
with regular event handlers of components in a single
process or thread.

Here is the code that I used to test this with that utilizes
1 main process/thread, 1 additional thread and 1 additional process.

------------------------------------------------------------
#!/usr/bin/env python

from time import sleep

from circuits import listener, Event, Component, Debugger, Manager

from workers import Thread, Process

class Foo(Component):

@listener("foo")
def onFOO(self):
print "foo"

@listener("msg")
def onMSG(self, s):
print s

class A(Thread):

def run(self):
while self.running:
try:
sleep(2)
self.push(Event("Hello from A"), "msg")
except KeyboardInterrupt:
self.running = False
break

class B(Process):

def run(self):
while self.running:
try:
sleep(3)
self.push(Event("Hello from B"), "msg")
except KeyboardInterrupt:
self.running = False
break

manager = Manager()
#manager += Debugger()

foo = Foo()
a = A()
b = B()

manager += foo
manager += a
manager += b

a.start()
b.start()

while True:
try:
manager.flush()
b.poll()
sleep(1)
manager.push(Event(), "foo")
except KeyboardInterrupt:
break

a.stop()
b.stop()

a.unregister()
b.unregister()
------------------------------------------------------------

I'll be later adapating primes.py found in the
examples/ directory of the circuits distribution
to utilize multiprocessing as well as distributed
processing. I may also provide other examples
of typical use-cases (distributed and parallel
csv processing for example).

The result of running the above test results in
the following (expected) output:

------------------------------------------------------------
$ python test.py
foo
foo
Hello from A
Hello from B
foo
foo
Hello from A
foo
Hello from B
foo
Hello from A
foo
foo
Hello from A
Hello from B
foo
^C
------------------------------------------------------------

Note: Each output line is approximately 1s in time.

Have a nice day and happy hacking :)

cheers
James
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,768
Messages
2,569,574
Members
45,051
Latest member
CarleyMcCr

Latest Threads

Top