Многопоточность Python: как сохранить работоспособность потока демона - PullRequest
2 голосов
/ 21 марта 2012

Я застрял в хитрой проблеме, чтобы проверить, работает ли поток демона.Поток демона, который я создал, должен работать в фоновом режиме, чтобы служба работала, поэтому я создаю и поддерживаю ее следующим образом:

Создание:

ASThread = threading.Thread(target = initAirserv, args=[],)
ASThread.setDaemon(True)
ASThread.start()

Внутри initAirserv() method:

def initAirserv(self, channel="15"):
        interface = self.execAirmon(options="start", interface=self.interface)
        port = self.plug_port
        if interface != "removed":
            if channel=="15":
                command = "airserv-ng -d " +str(interface)+" -p "+str(port)
            else:
                command = "airserv-ng -d " +str(interface)+" -p "+str(port)+" -c"+str(channel)
        else:
            return None
        AServConn=self.init_Plug()
        if AServConn:
            (stdin, stdout, stderr) = AServConn.exec_command(command)
            serv_op = stdout
            serv_er = stderr
            ##### keep the daemon thread run persistently ####
            a = 0 
            while 1:
                a += 1
        else:
            logging.debug( "SSH Error" )

Целью последних нескольких строк является занятость потока, используя глупый способ.Однако после запуска этого потока демона, и я сделал что-то еще, когда я вернулся и проверил поток следующим образом:

if ASThread.is_alive() == 1:
    # do something

тело if никогда не выполняется.Может кто-нибудь объяснить мне, почему это происходит?Какой лучший способ запустить поток, который выполняет то, что должно быть постоянно занятым?Большое спасибо.

Ответы [ 2 ]

2 голосов
/ 22 марта 2012

Размещенный код не складывается. initAirserv как опубликовано - это метод класса, но initAirserv, переданный конструктору Thread, не является.

Трудно также сказать что-то конкретное, не зная, что делают execAirmon и init_Plug, и что еще происходит в вашем приложении.

В общем, я бы сказал, что вы правильно поняли. Это должно работать. Тот факт, что это не означает, что ваши предположения неверны.

  • Вы уверены, что execAirmon возвращает что-то, что не равно "удалено"?
  • Вы уверены, что init_Plug возвращает не ложный объект?
  • Вы уверены, что не было исключений? (Я предполагаю, что вы заметите ложную трассировку стека, так есть ли другие части вашего приложения, которые могут проглотить их незамеченными?)
0 голосов
/ 21 марта 2012

Некоторым моим данным несколько месяцев, и все может измениться, поэтому, пожалуйста, потерпите меня.

Если вы используете стандартный Python на основе C и пишете многопоточное приложение, вам нужнознать об ограничении Global Interpreter Lock (GIL).То есть одновременно может работать только один поток.Если вы готовы использовать один из пакетов интерфейса Python C и написать большую часть своего кода на C, часть C вашего вызова функции может быть многопоточной и не подлежит ограничению GIL.

Python имеет отличную поддержку многопроцессорных и библиотек, и поскольку вы синхронизируете процессы, ограничение GIL не применяется.

Говорят об исправлении ограничения GIL, но сейчас этопроблема, которую вы должны принять.

ИМХО, я выбрал Python для написания программного обеспечения на Python, а не на C, если не нужно было решать очень специфическую проблему.Python является отличным языком для многих вещей, но ограничение GIL побудило меня выучить язык, который бы поддерживал лучшую синхронизацию событий, то есть многопоточную среду.

Надеюсь, это поможет.

...