У меня возникла проблема в том, что я хотел завершить многопроцессорный подпроцесс, если потребовалось больше времени, чем заданная длина таймаута. Я хотел установить тайм-аут в Popen()
, но это не сработало. Затем я понял, что Popen().wait()
равен call()
, и поэтому у меня возникла идея установить тайм-аут в рамках метода .wait(timeout=xxx)
, который, наконец, работал. Таким образом, я решил это так:
import os
import sys
import signal
import subprocess
from multiprocessing import Pool
cores_for_parallelization = 4
timeout_time = 15 # seconds
def main():
jobs = [...YOUR_JOB_LIST...]
with Pool(cores_for_parallelization) as p:
p.map(run_parallel_jobs, jobs)
def run_parallel_jobs(args):
# Define the arguments including the paths
initial_terminal_command = 'C:\\Python34\\python.exe' # Python executable
function_to_start = 'C:\\temp\\xyz.py' # The multithreading script
final_list = [initial_terminal_command, function_to_start]
final_list.extend(args)
# Start the subprocess and determine the process PID
subp = subprocess.Popen(final_list) # starts the process
pid = subp.pid
# Wait until the return code returns from the function by considering the timeout.
# If not, terminate the process.
try:
returncode = subp.wait(timeout=timeout_time) # should be zero if accomplished
except subprocess.TimeoutExpired:
# Distinguish between Linux and Windows and terminate the process if
# the timeout has been expired
if sys.platform == 'linux2':
os.kill(pid, signal.SIGTERM)
elif sys.platform == 'win32':
subp.terminate()
if __name__ == '__main__':
main()
Не полный ответ, но немного больше информации:
"Бортовой компьютер наведения "Аполлона" (AGC) был размером около 1 кубического фута с 2К 16-битной оперативной памяти и 36К памяти с жесткой проводкой в виде медных проводов, нанизанных или не нанизанных на крошечные магнитные сердечники. 16-битные слова обычно состояли из 14 бит данных (или двух операционных кодов), 1 бита знака и 1 бита четности. Время цикла составляло 11,7 микросекунды. Программирование осуществлялось на языке ассемблера и на интерпретируемом языке, на обратном польском языке. "
http://www.hq.nasa.gov/alsj/a11/a11.1201-fm.html
Добавлено: BBC недавно опубликовала замечательную статью об AGC, включая интервью с разработчиками и с "маленькими старушками", которые плели "веревочный сердечник". В ней не рассказывается о том, как разрабатывалось, кодировалось или тестировалось программное обеспечение, но вы, вероятно, все равно найдете ее интересной!
Кроме того, исходный код основного и посадочного модулей можно найти здесь
Управляющий компьютер Apollo был запрограммирован на ассемблере.
Не полный ответ, но немного больше информации:
«Бортовой компьютер управления Apollo (AGC) ) был около 1 кубического фута с 2K 16-битной оперативной памяти и 36K жесткой памяти сердечника и веревки с медными проводами, пронизанными или не пропущенными через крошечные магнитные сердечники. 16-разрядные слова были обычно 14 битами данных (или два операционных -коды), 1 знаковый бит и 1 бит четности. Время цикла составило 11,7 микросекунды. Программирование было выполнено на ассемблере и на языке интерпретации на обратном польском языке. "
http: //www.hq.nasa.gov/alsj/a11/a11.1201-fm.html
Added: BBC недавно опубликовала замечательную статью об AGC , включая интервью с дизайнерами, и с «маленькими старушками», которые плели «веревочную сердцевину». Это не
Я помню, как читал, что одно и то же программное обеспечение было написано (по крайней мере) двумя разными непересекающимися командами. Затем компьютеры сравнивают свои ответы и проверяют наличие расхождений ... не уверены, что они будут делать, если найдут какие-либо, но, по крайней мере, они будут знать, что возникла проблема. Я думаю, что на самом деле они использовали четыре разных компьютера и получили большинство голосов, поэтому, если один компьютер был не прав, он был проигнорирован.