Как я могу запустить 2 сервера одновременно в Python? - PullRequest
5 голосов
/ 23 декабря 2009

Мне нужно запустить 2 сервера одновременно в Python с использованием модуля потоков, но для вызова функции run () первый сервер работает, но второй сервер не работает до конца первого сервера.
Это исходный код:

import os
import sys
import threading

n_server = 0
n_server_lock = threading.Lock()

class ServersThread(threading.Thread):
    def __init__(self):
        threading.Thread.__init__(self)
        self.start()
        self.join()

    def run(self):
        global n_server, n_server_lock

        if n_server == 0:
            n_server_lock.acquire()
            n_server += 1
            n_server_lock.release()

            print(['MainServer'])

            # This is the first server class    
            main_server = MainServer()
        elif n_server == 1:
            n_server_lock.acquire()
            n_server += 1
            n_server_lock.release()

            print (['DownloadServer'])

            # This is the second server class
            download_server = DownloadServer()

if __name__ == "__main__":
    servers = []

    for i in range(2):
        servers += [ServersThread()]

Когда я вызываю серверный класс, он автоматически запускает бесконечный цикл while.
Так как я могу запустить 2 сервера одновременно?


Большое спасибо за вашу помощь, Fragsworth, я просто тестирую новую структуру и работаю отлично. Классы MainServer и DownloadServer наследуются от потоков. Обработка и запуск бесконечного цикла внутри run (). Наконец я звоню на серверы, как вы сказали.

1 Ответ

6 голосов
/ 23 декабря 2009

Вы не хотите join() в вашей функции __init__. Это приводит к блокировке системы до завершения каждого потока.

Я бы порекомендовал вам реструктурировать вашу программу, чтобы ваша основная функция выглядела следующим образом:

if name == "__main__":
    servers = [MainServer(), DownloadServer()]
    for s in servers:
        s.start()
    for s in servers:
        s.join()        

То есть, создайте отдельный класс потока для ваших MainServer и DownloadServer, затем сделайте так, чтобы они запускались асинхронно из основного процесса и затем присоединялись.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...