0

I have a class MyClass which creates 7 threads when it is initialized. One thread is a TCPServer, and the other six are objects of MyClass which the TCPServer uses to process requests.

My intention is to create method which can run in the background of MyClass and maintain the 6 threads. The 6 threads correspond to 2 distributed objects obj1 and obj2 replicated with an implementation of Raft called PySyncObj. There are three threads per object.

Each cluster of objects obj_1_cluster and obj_2_cluster has a leader, which the server must keep track of, because all changes to the object must be sent only to the leader.

class MyClass(object):

def __init__(self):

    self.server = TCPServer()

    self.obj_1_cluster = self.init_cluster(Class_1['bindings'], Class_1)
    self.server.obj1 = self.get_leader(obj_1_cluster)

    self.obj_2_cluster = self.init_cluster(obj_2['bindings'], Class_2)
    self.server.obj2 = self.get_leader(obj_2_cluster)


    # Create Daemon process for keeping leader current.
    self.obj1_leader_daemon = Thread(target = self.__obj1_leader_daemon())
    self.obj1_leader_daemon.setDaemon(True)
    self.obj1_leader_daemon.start()

    self.obj2_leader_deamon = Thread(target = self.__obj2_leader_daemon())
    self.obj2_leader_deamon.setDaemon(True)
    self.obj2_leader_deamon.start()

def __obj1_leader_daemon(self):
    while True:
        print("Running obj1 daemon")
        if self.server.obj1._isLeader():
            pass
        else:
            self.server.obj1 = self.get_leader(self.obj1)

def __obj2_leader_daemon(self):
    while True:
        print("running obj2 daemon")
        if self.server.obj2._isLeader():
            pass
        else:
            self.server.obj2 = self.get_leader(self.obj2)

When I run this code, the only output I see is...

Running obj1 daemon
Running obj1 daemon
Running obj1 daemon
...

until I kill the process with ctrl-C.

Is there a way to change this so that these two processes can run with their own thread- busily checking the state of the objects in case they need to change them? I've read a lot about threading and I don't see why this isn't currently working the way I think it should.

Environment: I'm running python 2.7.14 on MacOS 10.13.3.

Matt Hall
  • 331
  • 1
  • 4
  • 13

1 Answers1

1

__init__ gets stuck at

self.obj1_leader_daemon = Thread(target = self.__obj1_leader_daemon())

The thread target should be the name of the function to run, but you've called the function instead. self.__obj1_leader_daemon() is an infinite loop so it never returns, nothing is assigned to target and no thread is ever created. Your main thread hangs running the daemon code.

Just remove the cowboy legs

self.obj1_leader_daemon = Thread(target = self.__obj1_leader_daemon)

... and do the same for the other thread.

tdelaney
  • 73,364
  • 6
  • 83
  • 116