Найти - Пользователи
Полная версия: Прерывание скрипта по таймеру
Начало » Python для новичков » Прерывание скрипта по таймеру
1
Dezex
Утро доброе!
  • Структура скрипта:
    Process 0:
    subprocess 1 (n копий скрипта a)
    subprocess 2 (1 копия скрипта b)
  • Process 0 в петле_0 смотрит на вывод от subprocess 2 и при наличии сообщения пишет к subprocess 1
  • subprocess 1 в петле_1 смотрит на вывод от Process 0 и при наличии сообщений исполняет действия.
Мне нужно прерывание работы subprocess 1-2 либо:
1) руками
2) по таймеру

Меня интересует реализация 2).

Работаю на Linux, для него нашел оптимальное решение через signal package
(https://stackoverflow.com/questions/492519/timeout-on-a-function-call)

Думаю сделать поуневирсальнее, чтоб и на Windows работало (хотя врят ли буду пользоваться) - опыт.
Гуглил, но одназначного ничего не нашел.

Пока думаю, что оптимальным будет создание subprocess 3, в котором будет крутиться таймер… но опять путаница:

либо

А) subprocess 3 пишет в вывод событие, Process 0 в петле_0 дойдя до этого пишет ко всем subprosecc 1, которые увидя это в петле_1 останавливаются и ждут др. указаний….
- Но здесь будут задержки и в петле_0 и в петле_1.

- В этом случае нет смысла делать subprocess 3: в циклах можно сравнивать с таймером
 timeout = time.time() + 60*5 # 5 minutes from now
...
if time.time() > timeout: break

Б) В subprocess 3 должен генериоваться опять же signal (Linux), а для Windows??

Прошу помочь разобраться.
doza_and
Dezex
Прошу помочь разобраться.
Начать надо с того что вам надо разобраться когда необходимо использовать thread когда multiprocessing а когда subprocess а когда async.

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

Так что начните с описания задачи, а потом прочтите о перечисленных выше подходах.
Dezex
doza_and
Задача связаны с сетевым трафиком: генерация IGMPv2 report и отслеживание IGMPv2-query.

А) Для каждого VLAN_N из списка List_1 нужна генерация IGMPv2-report пакетов в количестве X. Каждый пакет в VLAN_N имеет индивидуальные параметры: IP (src/dst), MAC(src/dst).
Генерация пакетов происходит разово при наличии пакета IGMPv2-query.

Б) Параллельно с событиями А) запускается сниффер_1, который при наличии IGMPv2-query передают команду на повторную генерацию пакетов из А).

В) Также думаю параллельно запускать сниффер_2, который для каждого VLAN_N будет проверять наличие мультикаста в ответ на каждый b]IGMPv2-report из списка X. Периодически.

  • Значение X может достигать 250, VLAN_N (N до 30).
  • Генерация каждого пакета должна быть в пределах 10сек после получения соответ-о IGMPv2-query.
  • Генерация - использую scapy.
  • Снифер - сторонний, не питоновский (Linux - tcpdump, Windows - пока не нарыл).
    Сниффер от scapy не подходит, так как не видит теги 802.1q.

К сожелению мало опыта в параллельном выполнении сценариев, сразу ушел в subprocess.

Как я понимаю в моем случае действия А) правильнее через multiprocessing сделать. Через threading громоздко получиться.

Ну а для Б), В) только через subprocess
Rodegast
Какая задержка у таймера, как реализовать простой таймер на сигналах я уже писал: http://python.su/forum/topic/30947/?page=1#post-168204
Dezex
Rodegast
Какая задержка у таймера, как реализовать простой таймер на сигналах я уже писал: http://python.su/forum/topic/30947/?page=1#post-168204

Windows не поддерживает signal.SIGALRM, если я не ошибаюсь.
Rodegast
Ты сначала хоть что-то для linux-а сделай, а потом думай что переделывать и кому оно нужно. Как вариант можешь в отдельном потоке запустить бесконечный цикл и в нём делать прерывание снифера.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB