2010-03-29 3 views
4

Python에서 간단한 동시성을 위해 Twisted를 사용하는 데 문제가 있습니다. 문제는 - 어떻게 해야할지 모르겠지만 모든 온라인 리소스는 Twisted 네트워킹 능력에 관한 것입니다. 그래서 나는 약간의 지침을 위해 SO-gurus로 눈을 돌리고 있습니다.Twisted를 사용한 단순한 비 네트워크 동시성

파이썬 2.5가 사용됩니다.

다음과 같이 내 문제의

단순화 된 버전이 실행 :

  1. 과학적 데이터
  2. 데이터를 우적 출력
  3. 을 생성하는 기능의 무리 ??? < 여기 동시성 입사 그것은 1 데이터 청크를 취하고 2
  4. 출력 3에서 합류하고

내 추측 트위스트 reactor가 참조 할 수 있다는 저장에 공급 세 일. 그러나 어떻게?

도움과 제안을 많이 보내 주셔서 감사합니다.

upd1 :

간단한 예제 코드. 프로세스와 어떤 생각이 어떻게 반응 거래, 그래서 나는 그것을 상상의 기능이 제공되지 않은 :

datum = 'abcdefg' 

def dataServer(data): 
    for char in data: 
     yield chara 

def dataWorker(chara): 
    return ord(chara) 

r = reactor() 
NUMBER_OF_PROCESSES_AV = 4 
serv = dataserver(datum) 
id = 0 
result = array(len(datum)) 

while r.working(): 
    if NUMBER_OF_PROCESSES_AV > 0: 
     r.addTask(dataWorker(serv.next(), id) 
     NUMBER_OF_PROCESSES_AV -= 1 
     id += 1 
    for pr, id in r.finishedProcesses(): 
     result[id] = pr 
+0

간단한 장난감 예제를 추가 할 수 있다고 생각하십니까? 시작한 코드가 있습니까? – mcpeterson

+0

완료. 희망을 갖고 누군가가 도울 수 있기를 바랍니다. – Rince

답변

3

실제로 동시에 일을 계산하기 위해, 여러 파이썬 프로세스를 사용하는 아마가 필요합니다. 하나의 파이썬 프로세스가 계산을 인터리빙 할 수 있지만, 예외는 있지만 병렬로 실행하지는 않습니다.

Twisted는 이러한 여러 프로세스를 조정하고 그 결과를 수집하는 좋은 방법입니다. 이 과제를 해결하기위한 하나의 라이브러리는 Ampoule입니다. Ampoule에 대한 자세한 내용은 Launchpad 페이지 https://launchpad.net/ampoule에서 확인할 수 있습니다.

+0

내 문제와 관련된 예제 코드를 제공 할 수 있습니까? 그 어떤 문서도 아닌 것 같습니다. – Rince

+0

예제를 시작해야합니다. 웹상 어디에서나 호스팅되는 것을 볼 수는 없지만 0.2.0 릴리스를 다운로드하면 "examples"디렉토리에서 찾을 수 있습니다. –

2

전혀 뒤틀 렸습니까?

문제에 대한 설명에서 나는 multiprocessing이 청구서에 부합 할 것이라고 말하고 싶습니다. 하나의 Queue 인스턴스에 대한 참조가 제공된 Process 개체를 여러 개 만듭니다. 그들에게 일을 시작하고 그 결과를 Queue에 올리게하십시오. 결과를 읽으려면 블록 get()을 사용하십시오.

+0

슬프게도 제 기관은 파이썬 2.5를 사용하고 있으며 지금은 파이썬 2.6으로 갈 계획이 없습니다. 그래서 다중 처리의 장점은 없습니다. – Rince

+0

다중 처리가 2.6에서 백 포트로 사용 가능하다는 것을 제외하고 – quamrana

4

Jean-Paul이 말했듯이 Twisted는 여러 프로세스를 조정하는 데 적합합니다. 그러나 Twisted를 사용해야하고 분산 된 처리 풀만 필요로하지 않는다면 거기에 더 적합한 도구가있을 수 있습니다.

내가 언급 할 수없는 생각할 수있는 것은 celery입니다. Celery는 분산 작업 대기열입니다. DB, Redis 또는 RabbitMQ (여러 가지 무료 소프트웨어 옵션 중에서 선택할 수 있음)를 실행하는 작업 대기열을 설정하고 여러 가지 계산 작업을 작성합니다. 이들은 임의의 과학적 컴퓨팅 유형의 작업 일 수 있습니다. 태스크는 하위 태스크를 생성 할 수 있습니다 (위에서 언급 한 "참여"단계 구현). 그런 다음 필요한만큼 많은 노동자를 시작하고 멀리 계산하십시오.

저는 Twisted and Celery의 사용자가 많기 때문에 두 옵션 모두 좋습니다.

+0

예제 코드를 제공 할 수 있습니까? – Rince

+0

글쎄, 셀러리 웹 사이트에서 예제를 사용하겠습니다. 위에 제시된 예제를 반영하려면 먼저 여러 가지 작업을 작성하십시오. 작업은 본질적 dataWorker입니다 : celery.decorators에서 가져 오기 작업 @task 데프 dataWorker (체인지)) : 반환 ORD (체인지) 당신은 제발 당신만큼 작업을 쓸 수 -과 개념들이있어 어떤 일을하는 함수들 *. 그런 다음 다른 곳에서 (아마도 데이터 서버에서) 작업을 예약하기 만하면됩니다. result = dataWorker.delay (chara) 결과를 지연으로 간주 할 수 있습니다. 결과를 기다리거나 나중에 확인할 수 있습니다. – rlotun

+0

좋아요, 주석의 코드가 잘 보이지 않는 것을 잊어 버렸지 만 본질적으로 샐리 웹 사이트에서 당신이하려는 일에 가까운 아날로그를 확인하십시오. 다음 세 가지 구성 요소가 있음을 기억하십시오. 1) 작업자가 실행하는 작업 2) 작업을 저장하는 대기열 시스템 3) 작업 결과를 저장하는 장소. 샐러리는 Django와 함께 원활하게 작업 할 수 있습니다. – rlotun

관련 문제