문제

약간의 파이썬 응용 프로그램을 작성했으며 여기에서 일반적인 실행 중 작업 관리자가 어떻게 보이는지 알 수 있습니다.
(원천: Weinzierl.name)

응용 프로그램은 완벽하게 멀티 스레드이지만 당연히 하나의 CPU 코어 만 사용합니다. 대부분의 현대 스크립팅 언어가 멀티 스레딩을 지원한다는 사실에 관계없이 스크립트 하나의 CPU 코어에서만 실행할 수 있습니다.

Ruby, Python, Lua, PHP는 모두 단일 코어에서만 실행할 수 있습니다. 동시 프로그래밍에 특히 좋은 것으로 알려진 Erlang조차도 영향을받습니다.

단일 코어에 국한되지 않은 스레드를 지원하는 스크립팅 언어가 있습니까?

마무리

답변은 내가 기대했던 것이 아니라 그만큼 TCL 대답 가까이 온다. 추가하고 싶습니다 perl, (아주 좋아요 TCL)에는 통역사 기반 스레드가 있습니다.

Jython, Ironpython 그리고 그루비 입증 된 언어를 다른 언어의 입증 된 가상 기계와 결합하는 우산에 속합니다. 이 방향으로 힌트를 주셔서 감사합니다.

나는 선택했다 에이든 벨 답변 받아 들여진 답변. 그는 특정 언어를 제안하지는 않지만 그의 말은 나에게 가장 통찰력이있었습니다.

도움이 되었습니까?

해결책

스레드 구문은 정적 일 수 있지만 운영 체제 및 가상 머신의 구현은 변경 될 수 있습니다.

스크립팅 언어는 한 OS에서 진정한 스레딩을 사용할 수 있고 다른 OS에서는 가짜 스레드를 사용할 수 있습니다.

성능 요구 사항이있는 경우 스크립트 스레드가 OS에서 가장 유익한 레이어로 떨어지도록 할 가치가 있습니다. 사용자 공간 스레드는 더 빠르지 만 스레드 활동을 크게 차단하려면 커널 스레드가 더 좋습니다.

다른 팁

눈썹을 약간 올릴 수있는 "스크립팅 언어"의 정의를 사용하는 것 같습니다. 다른 요구 사항에 대해 무엇을 의미하는지 모르겠습니다.

어쨌든, 당신은 TCL을 고려 했습니까? 그것은 당신이 원하는 것을 할 것입니다.

당신은 당신의 목록에 상당히 범용 언어를 포함하고 있기 때문에, 나는 구현이 얼마나 무겁게 허용되는지 모르겠습니다. Zillion 체계 구현 중 하나가 기본 스레드가 아닌 스레드가 아닌 경우에 놀랄 것입니다. 그러나 내 머리 꼭대기에서 MzScheme 만 기억할 수 있지만 지원이 떨어 졌다는 것을 기억하는 것 같습니다. 확실히 일반적인 LISP 구현 중 일부는이 작업을 잘 수행합니다. ECL (Embeddable Common LISP)이하는 경우 효과가있을 수 있습니다. 나는 그것을 사용하지 않기 때문에 스레딩 지원 상태가 무엇인지 잘 모르겠다. 물론 이것은 플랫폼에 의존 할 수있다.

업데이트 또한, 내가 올바르게 기억한다면, GHC Haskell은 당신이 묻는 일을하지 않지만, 내가 기억하는 것처럼, 코어 당 기본 스레드를 회전시킨 다음 스레드를 실행하기 때문에 원하는 것을 효과적으로 수행 할 수 있습니다. 그것들을 가로 질러 ....

파이썬으로 자유롭게 멀티 스레드 할 수 있습니다 언어 Jython과 같은 구현 (@reginaldo가 Groovy IS를 언급 한 JVM) 및 Ironpython (.NET). @dan의 의견이 언급 한 바와 같이, Python 언어의 고전적인 cpython 구현을 위해 multiprocessing (대신 threading) 가능한 한 많은 코어를 자유롭게 사용하는 방법입니다.

처럼 그루비 Java Virtual Machine을 기반으로하며 실제 스레드를 지원합니다.

.NET 4의 F#은 병렬 프로그래밍을 지원하고 성능이 뛰어나고 스크립팅을 위해 특별히 설계된 .FSX 파일을 지원합니다. F#을 사용하여 모든 스크립팅을합니다.

이 질문에 대한 답은 이미 받아 들여졌지만 TCL 외에도 멀티 스레딩 및 스레드 안전 프로그래밍을 지원하는 유일한 해석 된 스크립팅 언어는 다음과 같습니다. Qore.

Qore는 다중 스레딩을 지원하도록 하단에서 설계되었습니다. 언어의 모든 측면은 스레드 안전입니다. 이 언어는 SMP 확장 성과 멀티 스레딩을 기본적으로 지원하도록 설계되었습니다. 예를 들어, 사용할 수 있습니다 background 새 스레드 또는 ThreadPool 스레드 풀을 관리하는 클래스. Qore는 또한 공통 스레드 오류가있는 예외를 제외하여 스레딩 오류 (현재 스레드가 이미 보유하고있는 잠금 장치를 잡으려고하는 것과 같은 스레딩 API의 오류와 같은 스레딩 오류)가 프로그래머에게 즉시 볼 수 있도록합니다.

Qore는 추가로 지원 및 스레드 리소스; 예를 들어, a DatasourcePool 할당은 스레드-로컬 리소스로 취급됩니다. 스레드를 종료하기 전에 거래를 커밋하거나 롤백하는 것을 잊어 버린 경우 DatasourcePool 클래스는 트랜잭션을 자동으로 롤백하고 문제에 대한 사용자 친화적 인 정보와 문제가 해결 된 방법으로 예외를 던집니다.

아마도 당신에게 유용 할 수 있습니다 - Qore의 기능에 대한 개요는 다음과 같습니다. 왜 Qore를 사용합니까?.

CSScript 와 함께 평행 연장 나쁜 선택이되어서는 안됩니다. 순수한 C#에 코드를 작성한 다음 스크립트로 실행하십시오.

스레딩 메커니즘과 관련이 없습니다. 문제는 (예 : Python) 스크립트를 실행하려면 통역사 인스턴스를 가져와야한다는 것입니다. 통역사를 획득하려면 참조 수 등을 유지 하고이 개체에 대한 동시에 액세스를 피해야하므로 통역사를 잠쳐야합니다. Python은 pthread를 사용하고 실제 스레드이지만 Python 객체로 작업 할 때는 하나의 스레드가 다른 스레드를 기다리고 있습니다. 그들은 이것을 길 (글로벌 통역사 잠금)이라고 부르며 프로세스 내에서 실제 병렬 처리를 불가능하게 만드는 주요 문제입니다.

https://wiki.python.org/moin/globalinterpretretlock

다른 스크립팅 언어는 같은 문제가있을 수 있습니다.

Guile은 하드웨어 스레드라고 생각하는 Posix 스레드를 지원합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top