python线程方法卡住

时间:2018-03-04 23:32:23

标签: python multithreading daemon python-multithreading raft

我有一个类MyClass,它在初始化时会创建7个线程。一个线程是TCPServer,另外六个是TCPServer用来处理请求的MyClass对象。

我的目的是创建可以在MyClass的后台运行并维护6个线程的方法。 6个线程对应于2个分布式对象obj1obj2,复制了Raft的实现,称为PySyncObj。每个对象有三个线程。

每个对象集群obj_1_clusterobj_2_cluster都有一个领导者,服务器必须跟踪该领导者,因为对象的所有更改都必须仅发送给领导者。

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)

当我运行此代码时,我看到的唯一输出是......

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

直到我用ctrl-C终止进程。

有没有办法改变这一点,以便这两个进程可以使用自己的线程运行 - 忙于检查对象的状态,以防需要更改它们?我已经阅读了很多关于线程的内容,但我不明白为什么现在这种方式不符合我的想法。

环境:我在MacOS 10.13.3上运行python 2.7.14。

1 个答案:

答案 0 :(得分:1)

__init__陷入

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

线程目标应该是要运行的函数的名称,但是您已经调用了该函数。 self.__obj1_leader_daemon()是一个无限循环,因此它永远不会返回,没有任何内容分配给target并且没有创建任何线程。您的主线程挂起运行守护程序代码。

只需移除牛仔腿

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

...并为其他线程做同样的事情。