#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
fromipython
down.2. Как насчет использования общей памяти? Я никогда не пробовал POSH (совместное использование объектов Python), но я слышал о нем много интересного. Затем вы могли бы структурировать свои процессы любым удобным вам способом.