웹 인터페이스 (Flask)에서 시작하는 다소 큰 데이터베이스 가져 오기 작업이 있습니다. 데이터베이스 가져 오기를 트리거하는 URL을 방문하면 데이터베이스 삽입을 수행하기 전에 포크를 실행합니다.Python 및 Flask의 장기 실행 작업
문제점은 웹 서비스 (내장 된 개발 서버에서 Ctrl + C)를 중지하려고 할 때 자식 프로세스가 대신 중지되고 웹 서버가 백그라운드에서 계속 실행된다는 것입니다. 어쨌든 마치 자식 프로세스가 현재 주 프로세스 인 동안 웹 서버 작업이 갑자기 백그라운드 데몬이되는 것처럼 보입니다.
내가 달성하고자하는 것은 웹 서버가 자식 프로세스를 시작한 다음 다시 예외를 적용하지 않는 "시작 자식 프로세스 및 그 다음이를 잊어 버리는"접근 방법입니다. 특히 예외 및 이와 유사한 경우에는 신경을 써야합니다.
가장 좋은 방법에 대한 아이디어가 있으십니까?
현재 가져 오기 기능에 대한 테스트 코드는 다음 코드와 함께 플라스크 경로 처리기에서 시작됩니다
def import_start():
try:
pid = os.fork()
except OSError as e:
print "Exception in import_start"
sys.exit(1)
if pid == 0:
with open("/tmp/web_out.txt", "w") as f:
for x in range(100):
f.write("line %d\n" % (x))
f.flush()
sleep(10)
:
import_start()
나중에 import_start를 죽일 것이다 Ctrl + C를 사용하여() 프로세스를 웹 서버 대신 사용하십시오. 두 프로세스가 출시 후 서로 완전히 독립적이어야하므로 다른 방법으로 사용하고 싶습니다.
UPDATE :
def start_import():
subprocess.Popen([sys.executable,__file__],stdout=subprocess.PIPE,stderr=subprocess.STDOUT)
def do_import():
with open("/tmp/web_out.txt", "w") as f:
for x in range(100):
f.write("line %d\n" % (x))
f.flush()
sleep(10)
if __name__ == "__main__":
do_import()
이 (내 웹 서버가 살해되어 생성 된 프로세스를 죽이는 제외) 작동하지만가 청소하지에 대해 조금 걱정 : 내가하고 결국
여하튼 과정. 이 문제를 해결하기 위해 MQ 접근 방식을 살펴볼 수도 있습니다.하지만 이는 새로운 프로세스를 생성하는 것보다 더 복잡합니다.
당신은 당신의 작업을 셀러리에 맡기고 플라스크 만 작업 스케줄을 잡아야합니다. 그러면 서버로 수행 할 작업을 http://usheryproject.org/ – dm03514
할 수 있습니다.하지만, 과제를 잊어 버리면 별도의 도서관이 필요하겠습니까? 아마 subprocess.Popen 그냥 import_start 함수를 호출하는 대신 외부 실행 파일로 스크립트를 실행하면 쉽게 (덜 영리한) 작업을 할 수 있습니까? – agnsaft
문제 해결 : 필자의 특별한 솔루션은 신호를 기다리는 별도의 데몬을 갖기 위해 Postgresql LISTEN/NOTIFY를 사용합니다. 그런 다음 웹 응용 프로그램은 가져 오기를 시작하기 위해 NOTIFY 만 필요합니다. – agnsaft