2012-08-16 1 views
0

루프가 2 천 개 레코드에서 실행되며 각 레코드에 대해 서버에서 일부 이미지 크기 조정 및 조작이 수행됩니다. 이 프로세스는 작은 레코드 세트를 테스트하는 데는 잘 작동하지만 라이브 서버로 이동하면 50 개 레코드를 일시 중단하고 다시 시작하여 서버 성능이 저하되거나 완전히 종료되지 않도록하고 싶습니다.서버 집약적 인 프로세스를위한 ColdFusion 코드 일시 중지 및 재개

코드는 다음과 같습니다

<cfloop query="imageRecords"> 
    <!--create and save images to server - sometimes 3 - 7 images for each record --> 
</cfloop> 

내가 말했듯이, 나는 다음 50 개 기록 후 일시 정지이 off 상태로 다시 시작하고 싶습니다. 나는 cfschedule을 보았지만 이것을 어떻게 작동 시킬지 확신이 없었다.

나는 또한 sleep() 함수를 살펴 보았지만, cfthread 태그 안에 이것을 사용하는 것에 대한 문서가 나와있다. 다른 사람들은 긴 프로세스를 시뮬레이션하기 위해이를 사용하는 방법에 관해 게시했습니다.

그럼, 내가 필요로하는 방식으로 sleep()을 안전하게 사용할 수 있는지 확신 할 수 없습니다.

서버는 CF9이고 db는 MySQL입니다.

+1

CFTHREAD에서 회전하는 것을 고려 했습니까? – ale

+0

@AlEverett 네, 좋습니다. 나는 실제로 스레드에서 모든 것을 래핑하고 그것을 일시 중지하는 것에 대해 생각하고있었습니다. 그러나 나는 sleep 함수를 루프에 넣고 작동한다. 프로세스를 실행 (폴더를보고 생성 된 이미지를 볼 수 있음) 한 다음 잠자기 한 다음 다시 픽업합니다. 이것이 올바른 방법인지 확실하지 않습니다. –

+1

수면은 단일 스레드 환경에서 정상적으로 작동합니다. 은 5 초의 일시 정지를 제공합니다. – Busches

답변

0

여기에 당신은 아마와 다른 접근 방식 중 하나를 결합 할 수있는 다른 방법은의를 실행하는 작업을 예정 :

<cfscript> 
th=CreateObject("java","java.lang.Thread"); 
th.setPriority(th.MIN_PRIORITY); 
// Your work here 
th.setPriority(th.NORM_PRIORITY); 
</cfscript> 

즉, t를 설정한다고 hread는 다른 요청을 처리하고있는 다른 스레드보다 우선 순위가 낮습니다. 이론적으로 가장 짧은 시간에 작업을 완료 할 수 있지만 다른 사용자에게주는 영향은 적습니다. 아직 테스트 할 기회가 없으므로 마일리지가 다를 수 있습니다.

3

나는 것 디폴트 값이 0으로하고 이미지가 업데이트되면 설정

다음
SELECT TOP 50 imagename 
FROM images 
WHERE worked = 0 

처럼 그런 다음 쿼리가 될 수 있습니다 1. 뭔가를 플래그를 설정 데이터베이스에서 근무라는 열을 만들 CF 매 X 분

+0

또한 예상보다 오래 걸리면 작업이 겹치지 않도록 'application'범위에 플래그를 두는 것이 좋습니다. – Sergii

+0

@mrbusche db에 열을 추가하지 않으려합니다. 프로세스를 일시 중지 한 다음 다시 시작할 수 있어야합니다. 답변 해주셔서 감사합니다. 다른 모든 방법이 실패하면 db 수정을 다시 고려할 것입니다. –