2014-05-15 1 views
7

Perlbrew 스레드 지원이없는 기본 Perl 당 설치합니다. 이것은 단순한 레거시 버릇입니까, 아니면 쓰레드 지원이있는 Perl 설치가 문제를 일으킬 수 있습니까?Perl은 일반적으로 스레드를 지원하지 않고 설치되는 이유는 무엇입니까?

+0

내가 질문을 편집 @mpapec :

perlbrew 주문은 펄 5.22.1를 들어 말한다. 실제로 저는 일부 RH 버전을 염두에 뒀지 만, 이제는 더 이상 그렇지 않습니다. 기본 Perlbrew는이 기능을 활성화하지 않습니다. – Matteo

답변

12

Perl을 스레드 지원으로 컴파일하면 프로그램에서 스레드를 사용하지 않더라도 모든 잠금 때문에 많은 오버 헤드가 추가됩니다. 스레드 지원으로 컴파일 된 Perl을 사용하여 간단한 벤치 마크에서 약 15 %의 오버 헤드를 측정했습니다.

+0

나는 이것을 이해할 수 있을지 모르겠다. 아니면 내가 오해하고 싶다는 말을하는 것이 더 나을 것이다. 내가 쓰레드를 사용하지 않는 perl 모듈을 실행한다면 -DuseThreads 인자로 컴파일 된 perl과 다른 성능 레벨을 얻는다는 말입니까? Perl 스레드는 ... 최고의 스레드가 아니라는 것을 알았지 만, 프로그램이 스레드를로드하지 않으면 인터프리터가 그런 종류의 히트를 기대하지는 못했습니다. 스레드가 사용되지 않을 때 잠금이 발생하지 않도록 적절한 인터프리터 동작을 설정하거나 해제 할 것이라고 생각할 것입니다. – dsollen

+1

@dsollen : 올바르게 이해하고 있습니다. Perl이 쓰레드를 지원하도록 컴파일 된 경우 병렬 사용, 즉 잠금 등 여러 가지 내부 구조를 안전하게 만들어야합니다. 이는 오버 헤드를 의미합니다. 이것은 Perl에만 국한되지 않습니다. 즉 멀티 코어 CPU를 사용하지 않았던 초기에는 멀티 코어 커널이 방금 오버 헤드가 많아 성능이 떨어 졌기 때문에 다양한 UNIX 버전에서 단일 코어 커널을 사용하는 것이 일반적이었습니다. . –

+0

오, thread-safe 방식으로 해석하는 것이 오래 걸린다는 사실에 놀라지 않습니다. 스레드 보안과 비 threadsafe 모드 사이를 전환 할 수있는 방법이 없기 때문에 스레드 안전을 사용하지 않고 코드의 어딘가에 "스레드 사용"이 없도록하는 데는 놀랐습니다. 다시 생각해 보면, 완전히 해석 된 언어에서는 런타임 전에 사용되는 인터프리터를 판단하기 위해 쓰레드가 사용된다는 것을 알 수 없습니다. 내 컴파일 된 언어 바이어스가 표시됩니다. 그래도, 적어도 인터프리터를 사용하기 위해서는 스레드에 대해 컴파일 된 펄은 -no-thread cmd 라인 인수를 가질 것이라고 생각합니다 – dsollen

1

Perl 스레딩은 일반적인 의미에서 스레딩이 아닙니다. 실제로 각 스레드마다 별도의 인터프리터가 실행되므로 공유 상태가 없습니다. 공유 메모리 모델은 스레드를 프로세스를 포크하는 주된 이유이므로 Perl 스레드는 거의 사용되지 않습니다.

또한 여러 스레드에서 스레드로부터 안전하지 않은 모듈을 동시에 사용하면 충돌 또는 기타 예상치 못한 동작이 발생하기 쉽습니다.

자세한 내용은 http://perldoc.perl.org/threads.html을 참조하십시오.

+0

예,하지만 스레드를 지원하는 Perl 버전을 사용하면 강제로 사용하지 않습니다. 그러한 버전을 가지고 스레드를 사용하지 않는 스크립트와 함께 사용하는 것은 문제가되지 않습니다. 또는 스레드를 사용하기 전에 사용자가 생각하도록 강제하지 않도록 설정했는지 (예 : 스레드를 사용하고, 나쁜 생각을하고, 생각하고 다시 perl을 설치 하시겠습니까?) – Matteo

+0

강제로 사용하지 않겠습니까? 견고성과 성능에 영향을 미치는 내부적 차이, 특히 사용하지 않을 때의 차이. – codenheim

4

기본값이 될만큼 강력하고 성능이 좋지 않기 때문입니다.

게다가 CPAN을 고려해야합니다. 스레드에 대한 걱정없이 C로 작성된 모듈이 너무 많습니다.

필자는 전직 Perl6/앵무새 개발자로서 모든 사랑과 존경심으로이 말을 전합니다. Perl5는 처음부터 마음 속의 스레딩 (threading)을 염두에두고 설계되지 않았습니다 (최소한 커뮤니티에 참여했을 때).

이 시점에서 필자는 충분한 사람들이 그것을 바꾸려한다고 생각하지 않습니다. 미래는 Perl6이 될 것이고, Parrot은 매우 일찍 스레드를 가졌습니다. 라이프 사이클의이 시점에서 Perl 5를 불안정하게 만드는 것은 의심 스럽습니다.

Perl이이 점에서 독특하지는 않지만 리눅스는 오랜 시간 동안 같은 방식이었습니다 (다루어야 할 커다란 커널 잠금이있는 것처럼). 대부분의 프로젝트는 그런 식으로 시작하지만, 일부 프로젝트는 다른 프로젝트보다 우선 처리됩니다. 펄 스레드 튜토리얼에서

1

:

Basic Thread Support

스레드 지원은 펄 컴파일시 옵션입니다. 프로그램이 컴파일 될 때가 아니라이 Perl이 사이트에서 빌드 될 때 켜지거나 꺼지는 것입니다. 스레드 지원이 활성화 된 상태에서 Perl을 컴파일하지 않으면 스레드를 사용하려는 시도가 실패합니다.

프로그램에서 구성 모듈을 사용하여 스레드가 이 활성화되어 있는지 확인할 수 있습니다.

2

@ steffen-ultisch가 말한 것처럼 성능 문제입니다.

하지만 원하는 경우 Perl을 스레드가 있거나 없어도 쉽게 설치할 수 있으므로 주어진 스크립트에보다 적합한 버전을 사용할 수 있습니다.

perlbrew install-multiple 5.22.1 --both=thread