After some work ... I've taken Laszlo's suggestion of using Value
(shared memory) objects
to share state between the -pseudo- Process (manager) object and it's
underlying multiprocessing.Process
instance (and subsequent process):

Here is the code:

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

import os
from time import sleep

from threading import activeCount as threads
from threading import Thread as _Thread

from multiprocessing import Value
from multiprocessing import Process as _Process
from multiprocessing import active_children as processes

class Process(object):

    def __init__(self, *args, **kwargs):
        super(Process, self).__init__(*args, **kwargs)

        self.running = Value("b", False)
        self.thread = _Thread(target=self.run)
        self.process = _Process(target=self._run, args=(self.running,))

    def _run(self, running):
        self.thread.start()

        try:
            while running.value:
                try:
                    sleep(1)
                    print "!"
                except SystemExit:
                    running.acquire()
                    running.value = False
                    running.release()
                    break
                except KeyboardInterrupt:
                    running.acquire()
                    running.value = False
                    running.release()
                    break
        finally:
            running.acquire()
            running.value = False
            running.release()
            self.thread.join()

    def start(self):
        self.running.acquire()
        self.running.value = True
        self.running.release()
        self.process.start()

    def run(self):
        pass

    def stop(self):
        print "%s: Stopping ..." % self
        self.running.acquire()
        self.running.value = False
        self.running.release()

    def isAlive(self):
        return self.running.value

class A(Process):

    def run(self):
        while self.isAlive():
            sleep(5)
            self.stop()

a = A()
a.start()

N = 0

while a.isAlive():
    sleep(1)
    print "."
    print "threads:   %d" % threads()
    print "processes: %d" % len(processes())

print "DONE"
----------------------------------------

Here is the result of running this:

----------------------------------------
$ python test3.py
!
.
threads:   1
processes: 1
.
threads:   1
processes: 1
!
!
.
threads:   1
processes: 1
.
threads:   1
processes: 1
!
.
threads:   1
processes: 1
!
<__main__.A object at 0x80de42c>: Stopping ...
!
.
threads:   1
processes: 0
DONE
----------------------------------------

This appears to work as I intended.

Thoughts / Comments ?

cheers
James
--
http://mail.python.org/mailman/listinfo/python-list

Reply via email to