직관적 인 동시 프로그래밍 추상화 기능이있는 최신 프로그래밍 언어


40

시스템 프로그래밍이 아닌 응용 프로그램 / 사용자 수준에 중점을 둔 동시 프로그래밍 학습에 관심이 있습니다. 동시 응용 프로그램 작성을위한 직관적 인 추상화를 제공하는 현대적인 고급 프로그래밍 언어를 찾고 있습니다. 생산성을 높이고 동시 프로그래밍의 복잡성을 숨기는 언어에 집중하고 싶습니다.

IMHO 내 생산성이 떨어지고 프로그래밍 모델이 직관적이지 않기 때문에 C, C ++ 또는 Java로 멀티 스레드 코드를 작성하는 좋은 옵션은 고려하지 않습니다. 반면, 생산성을 높이고 Python 및 멀티 프로세싱 모듈, Erlang, Clojure, Scala 등과 같은보다 직관적 인 추상화를 제공하는 언어는 좋은 옵션입니다.

경험을 바탕으로 무엇을 추천 하시겠습니까?

편집 : 당신의 흥미로운 답변을 주셔서 감사합니다. Erlang, Clojure, Scala, Groovy 및 Haskell과 같은 많은 좋은 후보자가 있기 때문에 실제로 시도하지 않고 결론을 내리는 것은 어렵습니다. 나는 가장 설득력있는 주장으로 답에 투표했지만, 어느 쪽을 고를 지 결정하기 전에 모든 좋은 후보자를 시험해 보겠다. :)


21
To give an example, I don't consider a good option writing multithreaded code in C, C++, or Java. 왜? On the other hand, Python and the multiprocessing module, Erlang, Clojure, Scala, etc. are some of my options.또 왜? 실제로 원하는 것을 더 잘 정의하려면 질문을 확장하십시오.
yannis

2
그렇다면 모든 어려움을 겪고있는 병렬 프로그래밍을 배우고 싶거나 복잡성을 숨기고 생산성에 집중하고 싶습니까?
MaR

@MaR 생산성에 집중하고 복잡성을 숨기십시오 :)
sakisk

이러한 언어 중 일부에서는 많은 중요한 개념을 피하고 (일부는 해결했다고 할 수 있음) C는 실제로 동시성을 배우는 가장 좋은 언어입니다. (적어도 나에게는 그렇게 보인다. 나는 나열된 모든 언어에 대해 충분히 모른다.) 생산성 향상은 종종 포괄적 인 학습과 충돌합니다.
user606723

1
@DeadMG 생산성 감소는 문제입니다. 문제 대신 언어의 구문에 집중하고 싶지 않습니다. 교착 상태로 어려움을 겪고 싶지 않습니다. 간단한 예를 들어, 나는 begin transaction end transaction내부에있는 모든 것이 교착 상태가 없어야하며 전체적으로 성공하거나 실패 해야하는 것과 같은 간단한 문장을 사용하고 싶습니다 .
sakisk

답변:


33

클로저 는 거의 확실하게 봐야합니다 . 제 생각에는 멀티 코어 프로그래밍을위한 가장 현대적인 언어이며 매우 생산적입니다.

주요 속성 :

  • 그것은 기능적 언어 이며, 동시성 및 더 높은 수준의 추상화를 사용하여 개발할 수있는 능력에 도움이됩니다. 그것은 완전히 불변의 영구 데이터 구조와 게으른 시퀀스를 특징으로하며 Haskell과 같은 기능적 언어에 경험이있는 모든 사람에게 친숙합니다.
  • 가변 상태에 대한 잠금없는 동시 액세스를위한 매우 새로운 소프트웨어 트랜잭션 메모리 시스템 이 특징 입니다. 코드 동시성 안전을 만드는 것은 종종 (dosync ....) 블록으로 코드를 감싸는 것만 큼 간단합니다.
  • 그것은이다 리스프 매크로 기반의 메타 프로그래밍 및 코드 생성은 매우 강력합니다 -. 이는 상당한 생산성 이점을 가져올 수 있습니다 (Paul Graham의 에세이- "Beating The Averages")
  • 그것은의 JVM 언어 - 그래서뿐만 아니라 당신이 자바 생태계의 라이브러리와 도구의 거대한 배열에 대한 액세스 권한을 얻을 수 있습니까, 당신은 또한 JVM 동시 서버 측 응용 프로그램을위한 효과적인 플랫폼을 만들기로 간 거대한 엔지니어링 노력 혜택을 누릴 수 있습니다. 실용적인 목적으로, 이러한 기초가없는 언어에 비해 큰 이점이 있습니다.
  • 그것은의 동적 - 아주 간결한 코드의 결과와 생산성의 많은. 그러나 필요한 경우 성능을 위해 선택적 정적 유형 힌트를 사용할 수 있습니다.
  • 이 언어는 설명하기 어려운 추상화중심 으로 설계 되었지만 실제 효과는 문제를 해결하기 위해 결합 할 수있는 상대적으로 직교하는 기능 세트를 얻는 것입니다. 예를 들어, 시퀀스 추상화는 모든 "순차적"유형의 객체 (목록, 문자열, Java 배열, 무한 지연 시퀀스, 파일에서 읽은 행 등)를 처리하는 코드를 작성할 수있게합니다.
  • 도움이되고 통찰력이 있지만 가장 실용적으로 는 훌륭한 커뮤니티 가 있습니다 . Clojure의 초점은 일반적으로 "일을하는 것"에 있습니다.

동시성 경사가있는 일부 미니 코드 샘플 :

;; define and launch a future to execute do-something in another thread
(def a (future (do-something)))

;; wait for the future to finish and print its return value
(println @a)

;; call two functions protected in a single STM transaction
(dosync
  (function-one)
  (function-two))

특히 다음 동영상 중 하나 이상을 시청할 가치가 있습니다.


21
강력한 형식의 언어에서 정적 형식 선언 의 목적은 "필요한 경우 성능을 향상시키는 것"이 ​​아니며, 나는 오래된 밀짚 꾼을 쫓아내는 Lisp 옹호자들을 아프게하고 있습니다. 형식 선언에는 두 가지 목적이 있습니다. 특정 컴파일 타임의 정확성을 보장하고 특히 원본 작성자 이외의 사람이 코드를보다 쉽게 ​​읽을 수 있도록하는 것입니다. 정적 타이핑이 제공하는 본질적으로 더 나은 성능은 단지 보너스입니다.
메이슨 휠러

8
요즘 직장에서 다른 개발자의 JavaScript 코드로 작업해야했으며 프로세스에서 가장 고통스러운 부분입니다. 함수 인수에 대한 유형이 없으므로 전체 코드베이스를 통해 그들이 무엇을 해야하는지 파악해야합니다. 어디에서 왔는지에 따라 할 수있는 일 JavaScript가 일반적인 구문 외에도 C 유형 시스템을 보유한 경우 이는 문제가되지 않습니다.
메이슨 휠러

1
@MasonWheeler : IMHO 타입 어노테이션없이 함수를 호출하는 방법을 알 수 없다면 문서화에 문제가 있습니다. 오리 유형 언어에서도 모든 것은 일반적으로 일부 구조적 유형 제약 조건을 충족해야합니다 (예 : 산술 연산을 지원해야하고 반복 가능해야하며 색인 작성 가능해야 함). 정적 유형은 함수 가 수행 하는 작업에 대한 많은 힌트를 제공하지 않기 때문에 최소한으로 만 도움 됩니다.
dsimcha

2
@Mason 정적 형식 선언에 다른 이점이 없다고 말한 적이 없습니다. 사실 나는 당신이 말한 이유 때문에 정적 유형 선언을 좋아합니다. 그러나 나는 또한 동적 타이핑의 생산성 향상을 좋아합니다. 절충입니다. 좋은 테스트 스위트를 보유하고 있다면 일반적으로 정확성을 보장하고 초보자가 올바른 사용법을 이해할 수 있도록 예제 코드를 제공한다는 측면에서 동적 타이핑의 많은 단점을 완화합니다. YMMV.
mikera

1
@ dsimcha-추상화를 중심으로 디자인하는 대안은 구체적인 구현을 중심으로 디자인하는 것입니다. 예를 들어, 대부분의 이전 Lisp 함수는 단점 셀에 저장된 링크 된 목록에서만 작동했습니다. 데이터 구조마다 다른 기능이 필요했습니다. Clojure에서 핵심 라이브러리 기능은 (답에서와 같이) 순차적으로 작동합니다.
mikera

27

당신은 D를 시도 할 수 있습니다. 그것은 세 가지 모델을 제공합니다. 나는 첫 번째 또는 두 번째를 권장합니다.

  1. std.concurrency . 모든 동시성 요구에이 모듈을 사용하는 경우 언어와 표준 라이브러리의 조합으로 스레드 간 격리가 시행됩니다. 스레드는 주로 메시지 전달을 통해 통신하며, "안전 우선"을 선호하고 낮은 수준의 데이터 레이스를 허용하지 않는 방식으로 공유 메모리에 대한 제한적인 지원을 제공합니다. 불행하게도 std.concurrency의 문서는 개선이 필요하지만, 모델은 Andrei Alexandrescu의 저서 "The D Programming Language"의 무료 장에 문서화되어 있습니다.

  2. 표준 병렬화 . 이 모듈은 일반적인 동시성이 아닌 멀티 코어 병렬 처리를 위해 특별히 설계되었습니다. ( 동시성 병렬 처리를 구현하기 위해 필요하지만 동시성과 병렬 처리는 같은 것이 아니다. ) 병렬 처리의 요점 성능이기 때문에 그들이 어려운 효율적인 병렬 코드를 작성하기 때문에, std.parallelism 어떤 분리 보증을하지 않습니다. 그러나 오류가 발생하기 쉬운 낮은 수준의 세부 정보를 많이 추상화하므로 수동으로 확인한 작업을 서로 독립적으로 수행하는 작업을 병렬화하는 경우 문제를 해결하기가 매우 어렵습니다.

  3. core.thread 는 OS 별 스레딩 API에 대한 저수준 래퍼입니다. std.concurrency와 std.parallelism 모두 후드에서 사용하지만, 자신의 동시성 라이브러리를 작성하거나 std.parallelism 또는 std에서 잘 수행 할 수없는 어리석은 코너 케이스를 찾는 경우에만 사용하는 것이 좋습니다. 동시성 어느 누구도 일상 업무에이 저수준의 것을 사용해서는 안됩니다.


불변성 / 순도, 기본적으로 스레드 로컬 저장소 및 순차적으로 돌연변이를 일으키는 공유를 언급해야합니다. C / C ++에서 동시성 코드를 작성하기 위해 누락 된 언어를 지원합니다.
deadalnix

@ deadalnix : 저에게 대부분 std.concurrency 모델의 세부 사항입니다 (격리가 어떻게 적용되는지). 이 게시물을 간결하게 유지하고 싶었습니다.
dsimcha

글쎄요 동시성은 라이브러리와 언어 지원이 모두 필요합니다.
deadalnix

@ deadalnix : 그렇습니다. 그러나 표준 동시성을 지원하기 위해 주로 사용되었습니다.
dsimcha

23

Erlang은 확실히 훌륭한 옵션이지만 조금 더 실용적인 것은 Google의 새로운 언어 인 Go 입니다.

다른 일반적인 언어와는 거리가 멀기 때문에 이미 다른 '쉬운'언어를 알고 있다면 쉽게 얻을 수 있습니다. 많은 사람들이 프로그래밍하기에 '편안한'면에서 파이썬이나 루아와 비교합니다.


@faif는 시스템 동시 프로그래밍이 아니라 응용 프로그램 / 사용자 수준에 대해 묻고 있습니다. 얼랭이 어떻게 맞습니까?
Chiron

@Raynos : 커뮤니티에 따라 다릅니다.
Donal Fellows

@DonalFellows 당신의 권리, 내 진술이 너무 좁은 것 같아요
Raynos

1
@Chiron : Erlang은 프로그래밍 언어이며 응용 프로그램을 만드는 데 사용됩니다. 일반적으로 다중 처리 응용 프로그램 Erlang으로 작성된 OS에 대해서는 들어 본 적이 없으며 '시스템 동시 프롬 밍'으로 어디에 적합한 지 모르겠습니다.
Javier

1
Go 튜토리얼에서 간단히 살펴본 후 IMHO는 (제한된) 포인터를 사용하는 C와 같은 구문을 가진 언어가 생산성을 높이는 현대 언어가 아니라고 말하고 싶습니다.
sakisk

23

Microsoft의 .net 용 병렬 프로그래밍을 살펴보십시오 . 매우 직관적입니다.

많은 개인용 컴퓨터와 워크 스테이션에는 여러 스레드를 동시에 실행할 수있는 2 개 또는 4 개의 코어 (CPU)가 있습니다. 가까운 장래의 컴퓨터에는 훨씬 더 많은 코어가있을 것으로 예상됩니다. 현재와 ​​미래의 하드웨어를 활용하기 위해 코드를 병렬화하여 여러 프로세서에 작업을 분산시킬 수 있습니다. 과거에는 병렬화를 위해 스레드 및 잠금에 대한 저수준 조작이 필요했습니다. Visual Studio 2010 및 .NET Framework 4는 새로운 런타임, 새로운 클래스 라이브러리 유형 및 새로운 진단 도구를 제공하여 병렬 프로그래밍에 대한 지원을 향상시킵니다. 이러한 기능은 병렬 개발을 단순화하여 스레드 또는 스레드 풀과 직접 작업하지 않고도 자연 관용구에서 효율적이고 세분화되고 확장 가능한 병렬 코드를 작성할 수 있습니다. http://i.msdn.microsoft.com/dynimg/IC292903.png


+1 이것이 바로 그가 요구하는 것입니다. 그러나 문제가 발생하면 하위 수준의 동시성을 이해하지 않고 디버깅하기가 어렵습니다. 말할 것도없이 C # 초보자로 이것을 사용하면 흥미로울 수 있습니다.
P.Brian.Mackey

@ P.Brian.Mackey-동의합니다. 그러나 이것은 드문 일이 아니지만 관계형 모델과 SQL을 완전히 이해하지 못하는 경우 ORM을 사용하는 것과 이것을 비교하는 데 무리가되지 않습니다.
Otávio Décio

1
특히 PLINQ. 작은 하위 작업에만 유용하지만 사용하기 가 매우 쉽습니다.
svick

21

Erlang과 Scala는 모두 배우 기반의 동시성 을 가지고있어 매우 직관적이고 배우기 쉽습니다.

컴퓨터 과학의 액터 모델은 "액터"를 동시 디지털 계산의 보편적 기본 요소로 취급하는 수학적 동시 계산의 수학적 모델입니다. 수신 한 메시지에 대한 응답으로, 액터는 로컬 결정을 내리고 더 많은 액터를 생성하며 더 많은 메시지를 보낼 수 있습니다. 수신 된 다음 메시지에 응답하는 방법을 결정합니다. 이는 계산에 대한 이론적 이해를위한 프레임 워크와 동시 시스템의 여러 실제 구현 을 위한 이론적 기초로 사용되었습니다 .


19

나는 지금 Haskell에 대해 배우고 있으며, 이 논문 을 읽음으로써 Haskell이 동시 프로그래밍을위한 좋은 옵션임을 확신하게되었습니다. 순전히 기능적 (유형 시스템은 함수가 전역 상태의 입력, 출력 또는 읽기 / 수정을 수행하는지 여부를 알고 있음)이기 때문에 트랜잭션과 유사하게 작동하는 소프트웨어 트랜잭션 메모리 (위의 논문에서 매우 훌륭하게 요약 됨)와 같은 작업을 수행 할 수 있습니다 데이터베이스에서-당신은 약간의 여분의 설탕만으로 원자 성과 같은 멋진 것들을 많이 얻습니다. AFAIK, Haskell 스레드는 매우 가볍습니다. 이러한 것 외에도 Haskell이 완전히 작동한다는 사실만으로도 간단한 작업을 단일 키워드 (par) 이상으로 병렬로 실행할 수 있습니다. 출처


7

Google의 GO 언어에는 동시성을위한 몇 가지 흥미로운 도구가 있습니다. 참조 : http://golang.org/doc/effective_go.html#concurrency을 하고 예제를 조금 아래로 읽습니다.

동시 프로그래밍은 큰 주제이며 여기에는 일부 Go 관련 하이라이트에만 필요한 공간이 있습니다.

많은 환경에서 동시 프로그래밍은 공유 변수에 대한 올바른 액세스를 구현하는 데 필요한 미묘함으로 인해 어렵습니다. Go는 공유 값이 채널에서 전달되고 실제로는 별도의 실행 스레드에서 적극적으로 공유하지 않는 다른 접근 방식을 권장합니다. 한 번에 하나의 고 루틴 만 값에 액세스 할 수 있습니다. 의도적으로 데이터 경쟁이 발생할 수 없습니다. 이러한 사고 방식을 장려하기 위해 슬로건으로 줄였습니다.

메모리를 공유하여 통신하지 마십시오. 대신, 통신하여 메모리를 공유하십시오.

이 접근법은 너무 멀리 갈 수 있습니다. 참조 카운트는 예를 들어 정수 변수 주위에 뮤텍스를 두는 것이 가장 좋습니다. 그러나 고급 접근 방식으로 채널을 사용하여 액세스를 제어하면 명확하고 정확한 프로그램을보다 쉽게 ​​작성할 수 있습니다.

이 모델을 생각하는 한 가지 방법은 하나의 CPU에서 실행되는 일반적인 단일 스레드 프로그램을 고려하는 것입니다. 동기화 프리미티브가 필요하지 않습니다. 이제 다른 인스턴스를 실행하십시오. 또한 동기화가 필요하지 않습니다. 이제 그 두 사람이 의사 소통을하도록하십시오. 통신이 동기화 프로그램 인 경우에는 여전히 다른 동기화가 필요하지 않습니다. 예를 들어 유닉스 파이프 라인은이 모델에 완벽하게 맞습니다. Goare의 동시성 접근 방식은 Hoare의 CSP (Communicating Sequential Processes)에서 비롯되었지만 유닉스 파이프의 형식 안전 일반화로도 볼 수 있습니다 ...


6

다음 버전에서는 C #을 사용하면 해당 다이어그램이 보여주는 것보다 훨씬 쉽습니다. Async와 Await라는 두 가지 새로운 키워드가 있습니다.

비동기는 함수 수정 자로 사용되며 "이 작업은 다른 스레드에서 작업을 수행합니다."

Await는 비동기 기능 내에서 사용되며 마법이 발생하는 곳입니다. 기본적으로 Await는 컴파일러에게 별도의 스레드에서 키워드 다음에 작업을 실행하고 결과를 기다리도록 지시합니다. 대기 호출 이후의 모든 코드는 작업 후 실행됩니다.

또한 작업이 호출 스레드와 동기화되므로 버튼 클릭에 대한 응답으로 비동기 작업을 수행하는 경우 수동으로 UI 스레드에 다시 게시 할 필요가 없습니다. 두 개의 작은 키워드와 많은 동시성 기능을 제공합니다. 자세한 내용은 여기를 참조 하십시오


괜찮은 OS C # 컴파일러는 이미 C # 5, async 및 await를 지원합니다.
Raynos

기본적으로 Await는 컴파일러에게 별도의 스레드에서 키워드 다음에 작업을 실행하고 결과를 기다리도록 지시합니다. 이 답변이 올바른지 궁금합니다-async await는 스레드에 관한 것이 아닙니다. 이 기사는 훌륭하다 : 실이 없다
sventevit

좋은 지적. 나는 그것에 대해 너무 간단히 말한 것 같아요. 실제로 발생하는 것은 "대기"가 완료된 작업의 이벤트를 구독하는 "계속"입니다. 그리고 그렇습니다. 특정 I / O 작업과 thread.sleep () (기본적으로 클럭 인터럽트에 응답)에는 스레드가 없습니다. 그러나 I / O가없는 작업을 수동으로 만든 것은 어떨까요? 기다릴 수있는 피보나치 계산기를 만들 수 있습니까? 기술적으로 기사는 "스레드가 없습니다"라는 말이 맞지만 실제로는 없었습니다. 그것은 항상 OS가 우리를 위해 무엇을하고 있는지에 대한 세부 사항을 숨기는 데 사용했던 개념이었습니다.
Michael Brown

6

여전히 C ++을 권장합니다. 적절한 동시 코드를 작성하는 데 필요한 추상화가 가능합니다. 작업 을 수행하기위한 좋은 라이브러리는 비교적 새롭기 때문에 실제로 C ++을 잘 사용하는 데 대한 지식은 일반적이지 않기 때문에 압도적 인 확률은 단순히 작업을 수행하기위한 라이브러리가 부족하다는 것입니다. 인텔의 TBB는 몇 년 동안 만 사용되었으며 Microsoft의 PPL은 작년부터 출시되었습니다.

당신은 TBB 나 PPL 같은 것을 사용하는 경우, 동시 코드는, 음, 정확히 아닌 사소한 동시성 사소한 결코하는 한, 쓰기에,하지만 훨씬 힘든에서. pthread 또는 Win32 스레드를 직접 사용한다면 마음에 들지 않는 것은 당연합니다. 실제로 그러한 함수로 어셈블러를 작성하고 있습니다. 그러나 PPL을 사용하면 병렬화되는 표준 기능 알고리즘, 동시 액세스를위한 일반 데이터 구조 및 이와 같은 좋은 것들에 대해 이야기하게됩니다.


1
Boost.Threads 또는 C ++ 0x std::thread(또는 std::tr1::thread)를 확인하십시오 . 실제로는 아주 좋은 추상화입니다. IMO.
greyfade

1
@greyfade : PPL 또는 TBB에는 전혀 아무것도 없습니다. boost::threadRAII가 적은 OS 래퍼입니다. PPL과 TBB는 실제 동시 알고리즘, 컨테이너 등입니다.
DeadMG

6

병렬 처리 및 동시성에 대한 모든 최상위 추상화가 있으므로 여기 에 Ada 용 플러그 가 필요합니다. 그렇지 않으면 태스킹이라고 합니다. 또한 OP가 직관적 (주관적 기준!)을 요구함에 따라 Java 중심 세계에 대한 다른 접근법이 높이 평가 될 것이라고 생각합니다.


5

액터, 데이터 흐름, 순차적 프로세스 통신 (CSP), 데이터 병렬 처리, 소프트웨어 트랜잭션 메모리 (STM), 에이전트 등을 허용하므로 JVM 기반 일 수 있다면 Groovy / Java / GPars를 제안 합니다. 여기서 요점은 각기 다른 "스위트 스폿"이있는 여러 수준의 동시성 및 병렬 처리 모델이 있습니다. 구성하려는 문제에 대한 솔루션과 조화를 이루지 않는 모델을 사용하고 싶지 않습니다. 하나의 모델 만 사용하는 언어 및 프레임 워크는 알고리즘 해킹으로 이어집니다.

물론 나는 Groovy와 GPars에 기고하면서 편향된 것으로 보일 수 있습니다. 반면에 나는 CSP와 파이썬으로 일한다. 파이썬 -CSP.

더 중요한 것은 원래 질문은 프로덕션 시스템을 작성하는 것이 아니라 학습에 관한 것입니다. 따라서 Groovy / Java / GPars 조합은 JVM 기반이 아닌 Just :: Thread Pro 또는 TBB와 같은 것을 사용하여 C ++에서 최종 생산 작업을 수행하더라도 좋은 학습 방법입니다.

(호스트 사이트의 스팸에 대한 일부 공황으로 인해 일부 합리적인 URL 링크를 제거해야했습니다.)


Russel, 당신이 원한다면, 당신은 당신이 채팅방에 링크 된 것을 말해 줄 수 있고 당신을 위해 그것들을 추가 할 것입니다 : chat.stackexchange.com/rooms/21/programmers
Dan McGrath

4

Clojure는 어떻습니까? 예를 들어 Swing을 사용할 수 있지만 Clojure 동시 프로그래밍 기능을 즐기십니까? Clojure는 꽤 잘 Java 통합이 있습니다.

또한 Java 7 Fork / Join 프레임 워크 를 고려 했습니까?


2

GroovyGPars 라이브러리 를보고 싶을 수도 있습니다 . GPars BTW는 다른 답변에서 언급 한 .NET Parallel Extension과 다소 유사하지만 Groovys 유연한 구문은 일부 상황에서 더 잘 읽습니다.


0

스칼라는 질문과 답변에서 여러 번 언급되었지만 스칼라와 Java 모두에서 사용할 수있는 액터 구현 인 Akka에 대한 언급은 보지 못했습니다 .


이 답변에 어떤 문제가 있습니까? 다른 대답은 akka를 언급하지 않았으며 akka는 동시 프로그래밍을 위해 높은 수준의 추상화를 구현합니다.
Giorgio

-1

나는 그것이 당신이 만들고있는 것에 달려 있다고 생각합니다. 데스크톱 앱 또는 서버? node.js는 서버의 동시 프로그래밍에 적합합니다 (코드 작성 및 성능 측면에서). 새로운 서버 앱을 작성하고 싶다면 아마도 시도해 볼 것입니다. 데스크톱 응용 프로그램에 대해 잘 모르겠습니다 ... C #으로 상당한 양의 자료를 작성했으며 복잡성을 멋지게 숨기는 도구가 있지만 다른 경우에는 직접 처리해야합니다.


-1

나는 이것에 대해 머리에 맞을 수도 있지만 TAOUP 7 장을 읽었 습니까? 내가 특별히 생각하는 섹션은 스레드 대 프로세스입니다. 동시 처리 개념은 대부분의 사람들이 스레드를 생각하게 만드는 것을 발견했지만 스레드가 자식 프로세스를 생성하는 것보다 쉽고 빠르다는 인스턴스는 보지 못했습니다.

운영 체제를 구축 한 똑똑한 사람들에게 동시성 처리에 대한 모든 세부 정보를 정리하고 있습니다. 이미 많은 통신 방법이 있으며 공유 리소스 잠금에 대해 걱정할 필요가 없습니다. 기본적으로 스레드는 효율성의 해킹이며 최적화 규칙에 속합니다. 필요 여부를 테스트하지 않은 경우 최적화하지 마십시오.

envoy for python 과 같은 좋은 하위 프로세스 라이브러리를 찾으십시오 . 또는 C로 여러 개의 개별 프로그램을 작성 하고 포크와 파이프 를 사용하여 서브 프로세스와 통신하는 다른 "마스터"프로그램을 작성할 수 있습니다 .


3
이것은 OP가 명시 적으로 원하는 것과 반대입니다. 프로세스를 스폰하는 것은 스레드를 수동으로 스폰하는 것과 같은 저수준입니다. OP는 높은 수준 의 동시성 추상화에 관심이 있습니다.
Konrad Rudolph
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.