ipython и fork()

#python #fork #process #ipython

#python #форк #процесс #ipython

Вопрос:

Я планирую скрипт на Python, который будет использовать os.fork() для создания множества дочерних процессов для выполнения некоторых вычислений. Родительский процесс будет блокироваться до завершения дочерних процессов.

Суть в том, что мне нужно иметь возможность запускать скрипт как из оболочки Unix с помощью python , так и из ipython using %run .

Каким образом дочерние процессы должны завершаться, чтобы избежать повторного входа в ipython командную строку? По моему опыту, sys.exit() не подойдет.

Комментарии:

1. Было бы проще использовать подпроцесс, а не os.fork?

2. Я не понял ваш последний абзац. Что вы хотите сделать после завершения дочернего процесса или что не так с sys.exit()?

3. @Thomas K: Хорошее предложение, но решение, которое я рассматриваю, критически зависит от os.fork() использования оперативной памяти и соображений производительности.

4. @ahmet alp balkan: Я хочу, чтобы дочерний процесс завершался, а не возвращался в ipython оболочку. Попробуйте, если вы не уверены, о чем я говорю.

5. черт возьми, я на Mac и у меня нет Windows (: Сообщается ли об этом как об ошибке на IPython? всегда ли он попадает в shell, даже если вы выполняете его вне командной строки (возможно, двойным щелчком по .py файлу)?

Ответ №1:

Кажется, работает следующее:

 import os, sys

child_pid = os.fork()
if child_pid == 0:
  print 'in child'
  os._exit(os.EX_OK)
  print 'hm... wasn''t supposed to get here'
else:
  print 'in parent'
  

Хитрость в том, чтобы использовать os._exit() вместо sys.exit() . Документация содержит следующий отрывок:

Обратите внимание, что стандартным способом выхода является sys.exit(n) . _exit() обычно должен использоваться в дочернем процессе только после fork().

Ответ №2:

В терминологии Linux, вместо fork редактирования процесса IPython, почему бы вам не exec использовать обычный интерпретатор python из оболочки IPython и не использовать этот единственный fork?

Комментарии:

1. У меня есть массивные структуры данных в памяти, к которым мне нужно получить доступ как из интерактивной ipython оболочки, так и из скрипта (как родительского, так и дочернего процессов). Отсюда и использование fork from ipython down.

2. Как насчет использования общей памяти? Я никогда не пробовал POSH (совместное использование объектов Python), но я слышал о нем много интересного. Затем вы могли бы структурировать свои процессы любым удобным вам способом.