0

我正在尝试在 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 循环的情况下工作(只需打印“一个”)。

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

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

希望这是足够的信息。

提前致谢!

/丹尼尔

4

2 回答 2

1

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

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

th = threading.Thread(target=rcon.RconProtocol, args=(serverAddress, rconPort, rconPass, serverName))
于 2013-07-25T01:09:17.550 回答
0

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

于 2013-07-25T02:07:26.377 回答