python线程方法卡住了
python threading method stuck
我有一个 class MyClass
,它在初始化时创建了 7 个线程。一个线程是 TCPServer,另外六个是 MyClass
的对象,TCPServer 用来处理请求。
我的意图是创建可以在 MyClass
后台 运行 并维护 6 个线程的方法。这 6 个线程对应于 2 个分布式对象 obj1
和 obj2
复制了一个名为 PySyncObj 的 Raft 实现。每个对象有三个线程。
每个对象集群 obj_1_cluster
和 obj_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 上 运行ning python 2.7.14。
__init__
卡在
self.obj1_leader_daemon = Thread(target = self.__obj1_leader_daemon())
线程目标应该是 运行 的函数名称,但您调用了该函数。 self.__obj1_leader_daemon()
是一个无限循环,因此它永远不会 returns,没有任何内容分配给 target
,也不会创建任何线程。您的主线程挂起 运行ning 守护程序代码。
去掉牛仔腿就可以了
self.obj1_leader_daemon = Thread(target = self.__obj1_leader_daemon)
... 对另一个线程执行相同的操作。
我有一个 class MyClass
,它在初始化时创建了 7 个线程。一个线程是 TCPServer,另外六个是 MyClass
的对象,TCPServer 用来处理请求。
我的意图是创建可以在 MyClass
后台 运行 并维护 6 个线程的方法。这 6 个线程对应于 2 个分布式对象 obj1
和 obj2
复制了一个名为 PySyncObj 的 Raft 实现。每个对象有三个线程。
每个对象集群 obj_1_cluster
和 obj_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 上 运行ning python 2.7.14。
__init__
卡在
self.obj1_leader_daemon = Thread(target = self.__obj1_leader_daemon())
线程目标应该是 运行 的函数名称,但您调用了该函数。 self.__obj1_leader_daemon()
是一个无限循环,因此它永远不会 returns,没有任何内容分配给 target
,也不会创建任何线程。您的主线程挂起 运行ning 守护程序代码。
去掉牛仔腿就可以了
self.obj1_leader_daemon = Thread(target = self.__obj1_leader_daemon)
... 对另一个线程执行相同的操作。