LINUX.ORG.RU

Python, ожидание завершения фонового процесса

 


0

1

Пилю некий простой скрипт. Он использует некий готовый модуль. Его методами я регистрирую некий обработчик события, который ждёт событие и выполняет некие действия при его появлении. Обработчик события видимо выполняется в отдельном треде, поэтому нужно чтобы скрипт не завершал свою работу. Логика там примерно такая:

# Мой обработчик
def MyEventHandler(e):
    print e

# регистрация моего обработчика (так положено по документации модуля)
api.events.onEvent = MyEventHandler

Как лучше сделать, тупо добавить в конец

while 1:
    pass
или как?

по идее тот тред и так не завершится, но вызовет твой калбек сам. то есть твоя функция выполнится в том треде.

если нет, то как минимум sleep добавь в свой while. иначе cpu на сотню будет отжираться.

VladimirMalyk ★★★★★
()
Ответ на: комментарий от VladimirMalyk

по идее тот тред и так не завершится, но вызовет твой калбек сам. то есть твоя функция выполнится в том треде.

Не, скрипт тут же завершает работу после запуска. А в ipython работает.

cpu на сотню будет отжираться.

Действительно…

Gicdillah
() автор топика
Ответ на: комментарий от baverman

Что за некий готовый модуль? Может там нужно eventloop запустить?

Skype4Py это.

Скрипт имеет такой вид:

import Skype4Py
skype = Skype4Py.Skype()
skype.Attach()

def HandlerMessage(message, status):
    do_something_with(message, status)

skype.OnMessageStatus = HandlerMessage
В ipython это работает как надо, а если запускать в скрипте, то он тут же завершается.

Gicdillah
() автор топика
Ответ на: комментарий от Gicdillah

Skype4Py это

Да, там никаким eventdriven не пахнет, тупо запускают поток, причем еще и с daemon = True.

Делай цикл со слипом.

baverman ★★★
()
Ответ на: комментарий от baverman

Делай цикл со слипом.

Ок, спасибо.

Забавно, я тут пока гуглил, нашёл что кто-то уже пилил что-то типа того что я пилю (простого бота для личных нужд). Там в конце скрипта используется цикл с raw_input:

while True: 
    raw_input('')
У этого есть какие либо преимущества перед sleep?

И ещё вопрос, если в скрипте используется слип, засыпают ли фоновые треды? Читал что в питоне многопоточность не очень…

Gicdillah
() автор топика
Ответ на: комментарий от Gicdillah

У этого есть какие либо преимущества перед sleep?

Это автоматом требует stdin.

И ещё вопрос, если в скрипте используется слип, засыпают ли фоновые треды?

Слип суспендит только текущий поток.

Читал что в питоне многопоточность не очень…

Больше не читай советских газет. С многопоточностью в питоне всё прекрасно, а плохо с cpu-bound конкурентностью.

baverman ★★★
()
Ответ на: комментарий от Gicdillah

Не совсем. Ты выставишь итервал проверки истинности условия. Соответственно если поток завершится, то скрипт какое-то время еще будет висеть, ожидая конца задержки для проверки истинности условия.

der_looser ★★
()
Ответ на: комментарий от baverman

А не подскажешь ещё как сделать чтобы перенаправление stdout работало? Если в обработчике события выполняется вывод текста с помощью print или sys.stdout.write(), а скрипт запущен с перенаправлением вывода в файл, то весь вывод в файле появится только после завершения работы скрипта. А когда скрипт запущен без перенаправления вывода, сообщения выводятся сразу, когда появляются события.
Причём даже такой костыль не помогает, сообщения появляются только после завершения скрипта:

log = []
def MyEventHandler(mgs):
    log.append(msg)

while True:
    while len(log) > 0:
        print log.pop()
    time.sleep(1)

Gicdillah
() автор топика
Ответ на: комментарий от baverman

А если не кошу, то как называть?

Пожалуй, в этом случае тоже «параллельностью».

tailgunner ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.