2013-07-25 5 views
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 (просто напечатайте «один»).

Так что мне немного любопытно, почему это происходит и что я делаю неправильно. Обычно я считаю себя хорошим человеком Google, но я не мог найти подобных случаев. Моей голове не нравятся примеры, когда вам нужно использовать время или случайные примеры. Думаю, мне нужно увидеть более практические примеры.

Кстати, «неправильно ли» помещать цикл while в классе? Должно быть, это снаружи каким-то образом? Должен ли я, возможно, создавать потоки в моем классе RconProtocol?

Надеюсь, что информации достаточно.

Заранее благодарен!

/Daniel

ответ

1

Вы звоните rcon.RconProtocol в главном thrad. Replcae следующая строка

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

с

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

Большое вам спасибо. Попробуй это :)! – jagardaniel

+0

@jagardaniel, [Примите ответ] (http://stackoverflow.com/help/accepted-answer), если мой ответ был полезен. – falsetru

0

Кроме того, это плохая идея использовать время цикла в качестве контроля высокого уровня в нити. Нити Python хороши для блокировки ситуаций, когда вы проводите большую часть своего времени, ожидая чего-то, а затем реагируете. В вашем случае вы должны использовать threading.Queue для отправки команд в поток, которые будут перенаправлены на ваш сервер. Таким образом, ваш поток будет заблокирован в ожидании очереди или передачи сообщения на ваш сервер.

+0

Спасибо за ваш ответ :)! – jagardaniel

Смежные вопросы