Я запускаю скрипт Python на сервере, который имеет следующую базовую структуру (псевдокод):
for data_item in data_items:
processed_result=process_data(data_item); #this takes time T0
upload_result_to_site(processed_result) #this takes time T1
Основные ограничения:
data_items
(большой) список данных
process_data()
использует много процессора.
upload_result_to_site()
занимает очень мало процессора.
T0
= 5*T1
(прибл.)
Теперь у меня ограниченное время на сервере, и я хотел бы использовать все это для интенсивного использования процессора process_data()
, а не для upload_result()
. к несчастью
upload_result_to_site()
необходимо.
Одним из решений было бы запустить:
upload_result_to_site(processed_result)
в фоновом режиме точно так же, как процессы можно запускать в фоновом режиме в Unix.
Я могу запустить весь сценарий в фоновом режиме (через os.popen3
или subprocess
) или использовать демона. Но я хочу самое простое решение этой проблемы. Я не смог найти способ использовать подпроцесс для вызова только части скрипта (одна функция)
multiprocessing.Pool.map()
можно использовать, но созданный им процесс должен быть присоединен и завершен в какой-то момент, иначе количество подпроцессов будет расти).
Есть ли простой способ сделать это?
Обновление: В настоящее время я использую этот обходной путь:
for data_item in data_items:
processed_result=process_data(data_item); #this takes time T0
os.system("myscript.py upload_result_to_site processed_result &")
где myscript.py
- имя скрипта, а соответствующие обработчики присутствуют в __name__==__main__
.
(Теоретический) недостаток в том, что это, вероятно, работает только на Unix. Так как мой сервер работает под управлением Unix, это нормально для меня. Если у кого-то есть лучшее решение, пожалуйста, ответьте.