Sage MATH로 작성된 프로그램의 실행을 병렬화하고 자동화하기 위해 간단한 Bash 스크립트를 실행하고 있습니다.
#!/bin/bash
for i in {1..500}; do
echo Spinning up threads...
echo Round $i
for j in {1..8}; do
../sage ./loader.sage.py &
done
wait
done 2>/dev/null
각 스레드에서 5초 후에 시간 제한을 추가하고 싶습니다.
../sage ./loader.sage.py &
시간 초과되어 스레드를 종료하고 실행을 계속합니다. 어떻게 해야 하나요? 이것이 멍청한 질문이라면 미리 사과드립니다. 구문을 올바르게 이해할 수 없는 것 같습니다. Ubuntu WSL에서 실행 중입니다. 제가 호출한 프로그램은 Python으로 작성되었으며 Singular와 연계하여 Sage MATH 인터프리터를 통해 실행되었습니다.
답변1
GNU 병렬 처리 사용:
parallel --timeout 5 -j 8 -N0 ../sage ./loader.sage.py ::: {1..4000} 2>/dev/null
../sage ./loader.sage.py
이는 한 번에 8개의 작업을 4000번 실행하며 각각의 시간 제한은 5초입니다.
병렬 매뉴얼 페이지에서:
--timeout duration
Time out for command. If the command runs for longer than duration seconds it will get killed as per --termseq.
참고: 이 명령은 전체 루프를 대체합니다.
답변2
man timeout - 내 Linux Mint에서는 OS를 선언하지 않았습니다.
timeout 5 ../sage ./loader.sage.py &
프로세스의 시작 및 중지를 보여주기 위해 일부 디버깅을 추가했습니다. Sage 시작 시 디스크가 제한되어 있고(캐시를 지워야 할 수 있음) 사용 가능한 CPU를 모두 사용할 수 없는 것 같습니다. (내가 아는 한) Python은 적시 컴파일되기 때문에 병목 현상이 발생할 수 있습니다.
#!/bin/bash
for i in {1..3}; do
echo Spinning up threads...
echo Round $i
for j in {1..3}; do
timeout 1.5 sleep 60 &
done
echo "==== $( date '+%H:%M:%S.%N') Before"; jobs
ps -f
wait
echo "==== $( date '+%H:%M:%S.%N') After"; jobs
ps -f
echo; timeout 1.0 sleep 0.2
done