2017-05-12 13 views
1

우리는 Celery 4.x를 사용하여 Django webapp을 사용하여 작업을 비동기 적으로 실행합니다. 주요 작업을 수행하려면 Django/Celery 코드가 20-100 개의 다른 서버와 네트워크 통신 작업을 수행해야합니다. 우리가 다른 서버에 보내는 요청은 모두 똑같습니다. 즉, 사용자가 Django에게 명령을 보내면 Django는 Celery에게 똑같은 명령을 20-100 개의 다른 서버 각각에 보내도록 명령합니다. 문제는 셀러리의 기본 구성으로 4 명의 직원이 있다고 말하면 셀러리는 단 4 대의 서버와 통신 할 것입니다. 이 문제를 해결하기 위해 gevent와 함께 Celery를 사용해 보았습니다. 그러나 gevent는 완전한 스레드가 아닌 coroutines를 사용하며 네트워크 작업을 위해 우리는 C로 작성된 자체 Python 모듈을 사용합니다. 즉, monthon patch가 될 수있는 python 소켓이나 요청 모듈을 사용하지 않습니다.장고 플러스 셀러리/RabbitMQ C 소켓 모듈 스레딩

그래서 우리가하고 싶은 것은 다음과 같습니다. 논쟁을 위해서, 우리의 C 통신 모듈이 "cnet"이라고 가정 해 봅시다.

# This uses our cnet module (written in C) to connect to a single other server 
def connect_to_server(server, user_data): 
    response=cnet.execute_request(server,user_data) 
    output=do_something_with_response(response) 
    return output 

@task 
def send_something_important_to_all_servers(dest_servers, user_data): 
    for server in dest_servers: 
     t = create new thread to run connect_to_server(server, user_data) 
     t.start() 
    wait/join on all threads 
    return 

나는 우리가이를 구현하는 방법에 대한 질문의 번호를 가지고 : 우리는 우리가 의사 소통을해야한다 (20 개) 다른 서버가있는 경우, 우리는이 같은 일을 수행하는 셀러리 작업 기능을 할 것이다. 처음에는 프리 포크 풀과 다수의 작업자를 사용했지만, 작업자 당 하나의 작업이지만 확장되지 않았습니다. 다음으로 우리는 gevent를 사용했습니다. 그러나 우리는 특별한 일을하지 않았습니다. 단지 4 명의 노동자와 셀러리를 시작했습니다. 여기서 일한 것과 비슷하게 많은 수의 청과물을 가지고 있습니다. https://groups.google.com/forum/?fromgroups=#!topic/celery-users/RNZLiNyykQQ 당연히 같은 문제를 보여 줬습니다. 4 명의 노동자를 가지고 있었다, 그리고 우리는 단지 동시에 4 개의 물건을 달리게했다.

이제 이벤트 릿 풀을 사용할 수 있다는 것을 읽었습니다.이 스레드는 여러 스레드를 생성하는 작업 내에서 사용할 수있는 tpool이라는 것을 가지고 있습니다. 워드 프로세서는 원숭이 패치가 불가능한 네이티브 C 네트워크 모듈을 사용하는 상황에서 특히 유용합니다. 이것이 우리에게 가장 좋은 방법입니다. 즉 tpool과 함께 eventlet을 사용합니까? 우리 상황에서 eventlet 대신 geent를 사용할 어떤 이유가 있습니까? 그렇다면 tpool과 동등한 gevent가 있습니까? 누구나 이런 상황을 처리하는 셀러리 코드의 예가 있습니까? 예 : 원숭이 패치가 될 수없는 비 네이티브 네트워킹 코드를 사용하고 있습니까?

답변

1

가장 좋은 옵션은 C로 멀티플렉싱하고 모든 요청을 처리하는 단일 기능으로 셀러 리에게 제시하는 것입니다. C에서이 작업을 수행하는 다양한 방법이 있지만 OS 스레드는 하나입니다. 가장 잘 알고있는 것, 가장 편한 것을 선택하십시오.

이벤트 릿 (Eventlet) tpool이 작동하지만, 크기가 기본값 인 20 개이므로 늘릴 수도 있습니다.

C 모듈 내부에서 파이썬 소켓 모듈을 사용하면 원숭이 패치가 계속 작동합니다. 아마도 가장 저렴하고 빠른 방법 일 것입니다.

업데이트 : eventlet.tpool() 수율. 블로킹 API가 라이브러리의 목적에 어긋나 기 때문에 문서에 명시 적으로 작성된 것은 아닙니다. 임의의 수의 코 루틴 (tpool 크기보다 작거나 큰)은 예상대로 작동합니다. Tpool 크기는 동시에 실행되는 OS 스레드의 수만 제한합니다.

+0

이 시점에서 C에서 다중화를 수행 할 수 없으며 매우 복잡한 C 프로그램에서 너무 많이 작동합니다. 그리고 저는 파이썬 소켓이 C 코드에서 사용되지 않았 음을 확신합니다. 그래서 tpool이 갈 길입니다. 하지만 tpool.execute가 다른 코 루틴으로 넘어가 tpool.execute를 호출하는 모든 coroutine이 동시에 실행할 수 있습니다 (어쨌든 20 개까지). 이것은 문서에 잘 설명되어 있지 않습니다. – Marc

+0

아마도 파이썬 소켓이 사용되지 않았지만 검색 및 바꾸기가 쉽습니다. Tpool은 그 밖의 모든 것을 산출합니다. – temoto

+0

gevent에 해당 모듈이 있습니까? 대신 eventlet.tpool을 사용하면 gevent.something을 사용할 수 있습니까? – Marc