문제

Stackless Python과 관련된 질문이 많이 있습니다.하지만 내 질문에 아무도 대답하지 않는 것 같습니다. (틀렸다면 정정해주세요. 제발!)항상 화제가 되고 있는데 궁금해서요.스택리스를 어떤 용도로 사용합니까?CPython보다 어떻게 더 나은가요?

예, 작업이 차단되지 않는 한 많은 경량 스레드를 빠르게 생성할 수 있는 녹색 스레드(스택리스)가 있습니다(Ruby의 스레드와 비슷합니까?).이게 무슨 용도로 좋은가요?CPython을 통해 사용하고 싶은 다른 기능은 무엇입니까?

도움이 되었습니까?

해결책

이를 통해 엄청난 양의 동시성으로 작업할 수 있습니다.제정신이라면 누구도 십만 개의 시스템 스레드를 생성하지 않을 것입니다. 그러나 스택리스를 사용하면 이를 수행할 수 있습니다.

이 기사에서는 Python과 Google Go(새로운 프로그래밍 언어) 모두에서 십만 개의 태스크릿을 생성하여 이를 테스트합니다. http://dalkescientific.com/writings/diary/archive/2009/11/15/100000_tasklets.html

놀랍게도 Google Go가 네이티브 코드로 컴파일되고 공동 루틴 구현을 자랑하더라도 Python이 여전히 승리합니다.

스택리스는 입력 데이터에 따라 매우 많은 수의 리듀서를 가질 수 있는 맵/리듀스 알고리즘을 구현하는 데 적합합니다.

다른 팁

Stackless Python의 주요 이점은 매우 가벼운 코 루틴을 지원하는 것입니다. Cpython은 기본적으로 코 루틴을 지원하지 않습니다 (누군가가 댓글에 발전기 기반 해킹을 게시 할 것으로 기대하지만) 따라서 Cpython은 Cpython을 명확하게 개선하여 코 루틴의 혜택을 누릴 수 있습니다.

나는 그들이 탁월한 주요 영역은 당신이 당신의 프로그램 내에서 많은 동시 작업을 실행할 때라고 생각합니다. 예제는 AI 용 루핑 스크립트를 실행하는 게임 엔티티 또는 생성 속도가 느린 페이지로 많은 클라이언트를 서비스하는 웹 서버가있을 수 있습니다.

그러나 공유 데이터와 관련하여 동시성 정확성과 관련하여 여전히 많은 일반적인 문제가 있지만 결정 론적 작업 전환은 제어가 어디에 전송 될 위치를 정확히 알기 때문에 안전 코드를 쉽게 작성하기가 더 쉽게 작성하여 공유 상태가 있어야하는 정확한 지점을 알고 있기 때문에 최신 정보.

Thirler는 이미 Stackless가 Eve Online에서 사용되었다고 언급했습니다. 명심하십시오.

(..) Stackless는 작업을 작은 작업, 작업 목적으로 분리하여 메인 프로그램에서 분할하여 스스로 실행할 수 있도록하여이를 더 이상 트위스트합니다. 이는 이메일 보내기 또는 이벤트 파견, 예를 들어 네트워크 패킷을 보내고 수신하는 것과 같은 화재 및 포당 작업에 사용될 수 있습니다. 하나의 작업 렛은 네트워크에서 패킷을 기다리는 반면 다른 작업은 게임 루프를 계속 실행합니다.

스레드와 같은 어떤면에서는 비판적이고 명시 적으로 예약되어 있으므로 동기화와 관련된 문제가 적습니다. 또한 작업 목록 간 전환은 스레드 스위치보다 훨씬 빠르며 컴퓨터 하드웨어에 의해 스레드 수가 심각하게 제한되는 반면, 많은 활성 작업 목적을 가질 수 있습니다.

(이 인용을 얻었습니다 여기)

PYCON 2009에는 주어졌습니다 매우 흥미로운 대화, CCP 게임에서 스택리스가 사용되는 이유와 방법을 설명합니다.

또한 아주 좋은 것이 있습니다 입문 자료, 스택리스가 응용 프로그램에 좋은 솔루션 인 이유를 설명합니다. (다소 오래되었을 수도 있지만 읽을 가치가 있다고 생각합니다).

Eveonline은 Stackless Python으로 크게 프로그래밍됩니다. 그것들은 그것을 사용하는 데 몇 가지 개발자 블로그가 있습니다. 고성능 컴퓨팅에 매우 유용한 것 같습니다.

Stackless 자체를 사용하지는 않았지만, 매우 일시적인 네트워크 응용 프로그램을 구현하기 위해 Greenlet을 사용했습니다. Linden Lab은 다음과 같은 사용 사례 중 일부는 다음과 같습니다. 고성능 스마트 프록시, 수많은 기계에 명령을 배포하는 빠른 시스템 및 수많은 데이터베이스가 작성하고 읽는 응용 프로그램 (약 1의 비율로) : 2는 쓰기가 매우 무겁기 때문에 대부분의 시간이 데이터베이스가 반환되기를 기다리는 데 소요됩니다) 및 내부 웹 데이터에 대한 웹 크롤러 유형 기본적으로 많은 네트워크 I/O를 수행 해야하는 모든 앱은 Bajillion Lightweight 스레드를 만들 수 있다는 이점이 있습니다. 10,000 명의 연결된 고객은 나에게 큰 문제가되지 않습니다.

그러나 Stackless 또는 Greenlet은 실제로 완전한 솔루션이 아닙니다. 그것들은 매우 낮은 수준이며, 당신은 그들과 함께 최대한의 응용 프로그램을 구축하기 위해 많은 원숭이 작품을 만들어야 할 것입니다. Greenlet 상단에 네트워킹 및 스케줄링 계층을 제공하는 라이브러리를 유지하기 때문에 이것을 알고 있습니다. 특히 앱을 작성하는 것이 훨씬 쉽기 때문입니다. 지금 이들 중 많은 사람들이 있습니다. 나는 Eventlet을 유지하지만 동의, 키랄, 그리고 아마도 내가 모르는 몇 가지가 더 있습니다.

쓰기를 원하는 앱의 종류가 제가 쓴 것과 같은 소리를 내면 이러한 라이브러리 중 하나를 고려하십시오. Stackless vs Greenlet의 선택은 어떤 라이브러리가 원하는 일의 요구에 가장 적합한지를 결정하는 것보다 다소 덜 중요합니다.

녹색 스레드의 기본 유용성, 내가 보는 방식은 높은 대기 시간 조작을 수행하는 많은 양의 객체가있는 시스템을 구현하는 것입니다. 구체적인 예는 다른 기계와 의사 소통하는 것입니다.

def Run():
    # Do stuff
    request_information() # This call might block
    # Proceed doing more stuff

스레드를 사용하면 위의 코드를 자연스럽게 쓸 수 있지만 객체 수가 충분히 크면 스레드는 적절하게 수행 할 수 없습니다. 그러나 실제로 많은 양의 녹색 스레드를 사용할 수 있습니다. 그만큼 request_information() 위는 다른 작업이 기다리고 나중에 돌아 오는 일부 스케줄러로 전환 할 수 있습니다. "차단"기능을 부를 수있는 모든 이점을 얻을 수 있습니다. 그들이 즉시 돌아온 것처럼 스레드를 사용하지 않고.

이는 간단한 방식으로 코드를 작성하려는 경우 모든 종류의 분산 컴퓨팅에 매우 유용합니다.

여러 코어가 자물쇠 대기를 완화하는 것도 흥미 롭습니다.

def Run():
    # Do some calculations
    green_lock(the_foo)
    # Do some more calculations

그만큼 green_lock 함수는 기본적으로 잠금 장치를 획득하려고 시도하고 객체를 사용하는 다른 코어로 인해 실패하면 기본 스케줄러로 전환합니다.

다시, 녹색 스레드는 차단을 완화하는 데 사용되어 코드를 자연스럽게 작성하고 여전히 잘 수행 할 수 있습니다.

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