2013-12-19 2 views
1
I 모음집 C를 생성하는 병렬 f를 불러야

스칼라 병렬 컬렉션

val c = collection.par.map{ f(_) } 

이 사용하려는

의 계산을 죽일되다.

그러나 기능 f를 제어하지 못했습니다.

일부 입력 인수의 경우 f는 버그가있어서 무한 루프가됩니다.

외부 악의적 인 사람은 함수 f에서 버그를 연습하는 이런 종류의 데이터 인수를 발견했습니다. 그래서 그들은 서비스 거부 공격 (denial-of-service attack)으로 시스템에 수많은 톤을 제출합니다.

그래서 함수 f의 작성자와 완벽한 협력 관계가 있더라도 복잡한 일을하는 함수이며 버그가있을 수 있습니다.

다른 스레드/배우/갯수가 측면에서 실행되는 경우 병렬 수집을 만들 때 무한 루프의 계산을 어떻게 중지시킬 수 있습니까?

그리고 관련 ... 내가 심지어 infinte 루프가 있다는 것을 알지 못한다면, 내 코드는 더 이상 c를 필요로하지 않는 분기를 취하고, 내 병렬 수집에 대한 모든 참조를 삭제합니다. c 위. 계산이 영원히 계속 될 것입니까, 아니면 객체가 GC에 의해 회수 될 때 멈출까요?

+2

pls가 깨진 창을 수정합니다! 그 주위에 돈 벌지 마! –

+0

나는이 세부 사항을 추가해야한다 : 함수 f는 순수 함수, 돌연변이, 쓰레드/액터/재밌는 비즈니스의 사용이 아니다. 하지만, 다른 회사에서 일하는 누군가 나에게 편지를 씁니다. –

+0

나는 충분히 명확하지 않았다. 나는 명확하게 (희망을 갖고) 이슈를 편집했다. –

답변

2

내가 알고있는 한, map 병렬 계산 기능을 사용하여 계산을 중단 할 수있는 좋은 방법은 없습니다. InteruptException을 던지기 만하면됩니다. 그렇다하더라도, 나는 성취 할 수있는 것이 있다면 무엇이 있는지 모른다. 당신이 ... 너무

class MyInteruptableFunction[+A,-B](f: A => B, waitCap: Long) extends (A => B){ 
    def apply(that: A) ={ 
    val timer = new Timer 
    timer schedule (new MyTaskThatThowsAnException, waitCap) 
    val out = f(that) 
    timer cancel() 
    out 
    } 
} 

을해야 할 일을했을 경우, 그 다음이 작업을 수행 : 그것은 당신의 작업을 완료 할 수 있습니다 (경향, 추한 자세한 정보 및 오류 그리고 여전히 오류가 발생 할 수 있습니다

val c = collection.par.map{ new MyInterruptableFunction(f, 42) } //42 is the answer! 

!) 그래서 만약에 "나는 이것을 할 수밖에 없다."라고한다면, 그것을해라.하지만 끝까지 문제를 해결하라. 그들의 매니저와 지옥을 올리십시오. 삶을 어렵게 만들 수있는 모든 일을하십시오. 나는 당신이 가지고 있다고 확신하지만 ...

+0

네, 모든 사람들은 함수 f의 작가로부터 협력을 얻어야한다고 말합니다. 그러나 여기에 시나리오가 있습니다 : 함수 f 저자는 완전히 협력 적입니다. 그러나 어떤 악의적 인 사람은 특별히 구조화 된 데이터 조각을 시스템에 전송함으로써 함수 f에서 버그를 일으켜 무한 루프를 일으킬 것이라고 생각했습니다. 따라서 많은 서비스를 보내서 서비스 거부 공격이 발생하면 시스템이 중단됩니다. 나는 항상 병렬 활동을 죽일 수있어이 가능성을 배제하고 싶다. –

+0

이전 의견은 실제로 모든 응답의 apropos이므로 원래 게시물을 편집했습니다. –

+0

나는이 해결책을 받아 들일 것이다. goop을 멋지게 캡슐화하므로 코드가 복잡해지지 않습니다. par 컬렉션에서 스레드를 사용하는 방법에 대한 가정을 만드는 스레드 코드가 아닌 Timer 만 사용합니다. 나는 f (그)와 타이머 만료 사이의 경쟁 조건이이 문제에 대한 어떤 해결책에서도 피할 수 없다고 생각한다. –

2

어떻게 f을 단일 스레드 컨텍스트로 처리합니까?

Java는 비 종결 처리에 대한 매우 좋은 옵션을 제공하지 않습니다. 가장 잘 관리 할 수있는 방법은 비 터미네이터를 자체 스레드로 랩핑하고 (안전하지 않은!) Thread.stop 메소드를 호출하는 것입니다. 지금까지 우수한 옵션은 처음에 f을 종결하지 않는 것입니다.

+0

좋은 지적. 이 문제는 병렬 처리에 관한 문제가 아닙니다. 나는 그 맥락에서 우려에 부딪쳤다. –

관련 문제