2013-06-16 1 views
3

필자는 필자가 연구에 집중해야 할 부분에 대해 도움이되기 때문에 (필자가 스레드를 고려해야 만하는 경우) 이에 대한 의견을 듣고 싶습니다.스레드가 그 프로세스를 수행 할 수없는 것은 무엇입니까?

스레드가 절대적으로 필요하고 다중 프로세스 모델이 적절한 솔루션을 제공 할 수없는 레일스 애플리케이션의 예가 있습니까? 한 가지 예외는 메모리 제한이 있고 여러 프로세스를 생성하는 대신 스레드를 사용해야하는 응용 프로그램입니다. 그러나 메모리가 문제가 아니라고 가정하면 스레드가 더 나은 내기가있는 몇 가지 추가 사례는 무엇입니까?

답변

1

스레드는 작성하고 디버그하기가 더 쉽습니다. 간단한 비 스레드 코드로 시작하여 디버그 한 다음 끝에 chunk를 Thread.newjoin으로 감 쌉니다. 끝났습니다.

그리고 네, 그들을 연구하십시오. 유용한 테크닉을 배우고 "프로그래밍 툴 체이스"에 필요한 지식을 습득하게됩니다.

스레드가 그 프로세스를 수행 할 수있는 범위까지는 할 수 없습니까? 스레드는 동일한 큐 또는 대기열에서 데이터를 매우 쉽게 공유하고 작업 할 수 있습니다. 별도의 프로세스로 처리하려면 데이터베이스 또는 IPC가 필요하거나 메시징 큐를 사용해야합니다. 많은 복잡성이 추가됩니다 (용량도 증가 할 수는 있지만).

+0

대부분의 경우 스레드의 복잡성과 복잡성에 대해 읽지 않습니다. 그들의 단순성. 많은 프로그래머가 별도의 프로세스 간 메시징 대기열을 고려하여 기꺼이 노력하고 있습니다. 이것에 동의하십니까? –

+0

나는 직업의 복잡성에 달려 있다고 생각한다. 스레드는 무거운 가중치 작업을위한 것이 아닙니다. 적어도 우리가 지금 가지고있는 것은 아닙니다. 우리는 직장에서 MQ를 사용하여 24 시간 이상 걸리는 작업을 관리했습니다. 일부 작업은 Ruby 및 작은 * nix 호스트에서 1 시간 미만으로 단축되었습니다. 실은 그것을하지 않았을 것이다. 그러나 다시 MQ를위한 노드를 작성하는 것은 과도 할 수 있으므로 작업을 고려하고 해당 작업에 적합한 것을 수행해야합니다. –

0

일반적으로 스레드는 프로세스보다 생성/제거가 더 효율적입니다.

SideKiq은 주로 SideKiq 작업자가 스레드이기 때문에 Resque보다 효율적이며, Resque는 분기 작업자 (프로세스)를 사용합니다.

하지만 문제는 Ruby on MRI에 원시 스레드가 없으므로 Ruby의 각 스레드가 GIL (Global Interpreter Lock)에 의해 제한된다는 것입니다. 자세한 내용은이 Igvita 문서를 참조하십시오. http://www.igvita.com/2008/11/13/concurrency-is-a-myth-in-ruby/

JRuby와 같은 원시 스레드가있는 플랫폼에서는 멀티 스레드 레일스 응용 프로그램 (서블릿 컨테이너에서 실행)을 사용할 수 있으며 MRI에서 실행되는 동일한 응용 프로그램을 능가 할 가능성이 높습니다 . 또한 Hotspot JVM상의 JRuby가 JIT (just-in-time) 성능 최적화를 수행 할 수도 있습니다.

관련 문제