无法启动多个服务器线程

时间:2013-07-25 01:05:56

标签: python multithreading

我正在尝试在python中创建一个程序,我必须同时运行两个类。所以我要做的是,我只是为类的每个实例创建一个线程。编程对我来说很新,所以这就是我们所说的“用户错误”;)

这是我的代码:

import threading
import sys

servers = [
    ["Server 01", "192.168.0.1", 12345, "password"],
    ["Server 02", "192.168.0.1", 12346, "password"],
]

def main():
    for row in servers:
        serverName = row[0]
        serverAddress = row[1]
        rconPort = row[2]
        rconPass = row[3]
        th = threading.Thread(target = rcon.RconProtocol(serverAddress, rconPort, rconPass, serverName))
        th.start()

if __name__ == '__main__':
    main()

该代码适用于servers中的第一台服务器。但是它在th.start()之后停止了。所以在th.start()之后我做什么并不重要,它不会运行。 RconProtocol除了收听套接字外没有做任何特别的事情。这就是我认为问题所在。我在RconProtocol类(while True)中有一个无限循环。

我试图做一个类似的功能(我做了另一个名为two):

def one():
    while True:
        print "one"

并将其指定为我的线程的目标,我遇到了同样的问题。它没有while循环(只打印“one”)。

所以我有点好奇为什么会这样,我做错了什么。我通常认为自己是一个好的谷歌人,但我找不到任何类似的案例。我的头脑不喜欢你必须使用时间或随机例子的例子。我想我必须看到更多实际的例子。

顺便说一句,在这样的类中放置while循环是“错误的”吗?它应该以某种方式在外面吗?我应该在我的RconProtocol课程中创建线程吗?

希望这是足够的信息。

提前致谢!

/丹尼尔

2 个答案:

答案 0 :(得分:1)

您正在主线程中调用rcon.Rcon协议。替换以下行

th = threading.Thread(target=rcon.RconProtocol(serverAddress, rconPort, rconPass, serverName))

th = threading.Thread(target=rcon.RconProtocol, args=(serverAddress, rconPort, rconPass, serverName))

答案 1 :(得分:0)

此外,使用while循环作为线程中的高级控件是个坏主意。 Python线程适用于阻塞大部分时间等待某些事情然后做出反应的情况。在您的情况下,您应该使用threading.Queue向您的线程发送命令以转发到您的服务器。这样,您的线程将被阻塞,等待队列或向您的服务器发送消息。