2013-07-31 8 views
0

Java 호출 스택을 수정하거나 액세스 할 수 있습니까? 예를 들어 저장하고 복원 하시겠습니까? 나는 협업 멀티 태스킹 (특히 ​​I/O)을 python 또는 haskell (기본적으로이 작업을 수행함)과 같이 gevent와 같이 구현하려고 생각합니다. 비동기 콜백 스파게티 엉망은 최고의 솔루션이 될 수 없습니다.Java 호출 스택을 설정하십시오.

답변

0

가장 간단한 해결책은 다중 스레드를 만드는 것입니다. 한 서버에서 최대 10,000 개의 스레드를 효율적으로 실행할 수 있습니다. 이보다 더 많은 것을 원한다면, 나는 a) 두 번째 서버를 구입하거나 b) non-blocking IO를 사용할 것을 제안 할 것이다.

일반적으로 다중 스레드를 사용하는 것이 가장 간단하며 스레드 수가 적 으면 가장 빠릅니다.

다양한 방식으로 Java에서이를 수행 할 라이브러리가 있습니다. 그들은 모두 공통의 문제로 고통을 겪습니다. 느려지거나 훨씬 복잡하거나 두 가지입니다.

BTW 스레드 컨텍스트 전환시 정확히 사용자가 제안한 바를 수행하지만 OS가이를 수행하므로이 점을 확인합니다.

+0

10,000 명이 꽤 좋을 것입니다. 하지만 나는 그런 엄청난 양의 쓰래드가 문맥 전환 (context switch)을 의미한다고 생각했다. 스레드가 통신 할 필요가있을 때 이것은 더욱 악화됩니다. 경량 스레드는 커널 잠금 등을 포함하는 컨텍스트 스위치가 없기 때문에 훌륭합니다. 실제로 자바가 프로그래밍 방식으로 스택에 액세스 할 수 있다면 꽤 간단합니다. 싸구려 네이티브 OS 스레드의 개념을 좋아하지만 이것이 가능하다고 생각하지 않습니다. 편집 : 다음 경량 스레드 비동기 IO를 사용하여 관리 할 수 ​​있습니다. – Kr0e

+1

Java 스레드가 커널 스레드 일 필요는 없습니다. JVM은 원하는대로 스레딩을 구현할 수 있으며 스레드 풀링이 일반적입니다. 실시간 호출 스택을 수정하는 것은 VM을 다시 작성하는 것과 기본적으로 동일하며 Java 자체에서이를 수행 할 방법이 없습니다. VM 에이전트는 그렇게 할 수 있지만 이미 사용할 수있는 디버깅 및 튜닝 된 스레드 구현을 사용하면 훨씬 편리합니다. – chrylis

+0

첫 번째 JVM (1.1) 중 하나의 커널 스레드를 사용하지 않는 JVM을 인식하지 못합니다. 그러나 그들은 커널 스레드로 상당히 빠르게 변했습니다. 따라서 JVM 구현이 경량 스레드를 지원할 가능성은 거의 없습니다. 네트워크 응용 프로그램의 경우 녹색 스레드를 사용하면됩니다. 불행히도 Haskell, Go, C# 같은 그린 스레드를 지원하는 언어는 단지 소수의 언어 뿐이며 (C# 일종의 가짜 Haskell이나 Go가 아닌), Python은 Gevent를 사용합니다. 글쎄, 10 억 라인의 콜백 스파게티 코드 = ( – Kr0e

관련 문제