Синхронизировать процесс очистки между потоками - PullRequest
0 голосов
/ 13 декабря 2010

Я планирую проект, основанный на потоке Python.Каждый поток должен запустить внешнюю программу, используя subprocess.Popen и собрать некоторые выходные данные.

В качестве побочного эффекта внешняя программа может оставить:

  • Temp files
  • Zombie Process

Я не могу запустить эту очистку для каждого потока, потому что у меня нет способа связать потоки с его PID-файлами внешней программы (эта программа запускает другую программу)и это временные файлы.

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

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

Не могли бы вы предоставить фрагмент кода для демонстрации такой очистки?

1 Ответ

1 голос
/ 14 декабря 2010

ОК, у вас действительно есть две вещи, на которые стоит обратить внимание:

  • Очистка не должна начинаться, пока рабочие потоки не закончили раунд итерации
  • Рабочийпотоки не должны начинать следующую итерацию, пока очистка не будет завершена.

Я думаю, что лучший способ сделать это - дать каждому рабочему потоку пару событий (threading.Event()), readycleanup и cleanupfinished,Затем в рабочих потоках:

# ... main operation
self.readycleanup.set() # Still within loop
self.cleanupfinished.wait()
self.cleanupfinished.clear()
# End of loop

Между тем в потоке очистки:

for worker in workerthreads:
    worker.readycleanup.wait()
do_cleanup_stuff()
for worker in workerthreads:
    worker.readycleanup.clear()
    worker.cleanupfinished.set()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...