5

나는이 비동기이나 mixin (ThreadingMixIn 및 ForkingMixIn가)SocketServer 용 ThreadingMixIn 및 ForkingMixIn 용 풀이 있습니까?

가 각 요청에 작동 두의 문제 (새 스레드 또는 포크를 할당 받았습니다 SocketServer 을 기반으로 BaseHttpServer를 사용하여 HTTP 프록시를 만들려고 노력했다 각각의 요청에 대한 새로운 하위 프로세스)

거기에 4 개의 하위 프로세스와 40 개의 스레드가 각각 에있는 풀을 사용하는 Mixin은 이미 생성 된 스레드에서 요청을 처리하게됩니까?

이것은 큰 성능 향상이 될 것이므로 일부 리소스를 절약 할 수 있기 때문입니다.

답변

1
+0

https://pypi.python.org/pypi/Spawning/ –

+0

과 같은 이벤트 릿 기반 서버와 비교해야 할 수도 있습니다. 더 이상 py 2.7을 사용하지 않습니다. 데모를 시도 할 때이 오류가 발생합니다. pickle.PicklingError : pickle : thread.lock으로 찾을 수 없습니다. – OriginalCliche

+0

py 2.7을 사용하고 있으며 코드가 피클하지 않습니다. –

5

당신은에서 풀을 사용할 수있는 수행 할 작업을 완료 (CTRL + C 뒤처리)에 가입 할이 문제를 해결하는 프로젝트를 시작했습니다 concurrent.futures는 (파이썬 3.2부터 다음 stdlib에) : 당신이 스레딩 경우에 대한 구현을 볼 수 있듯이

from BaseHTTPServer import HTTPServer, test 
from SimpleHTTPServer import SimpleHTTPRequestHandler 
from SocketServer  import ThreadingMixIn 

from concurrent.futures import ThreadPoolExecutor # pip install futures 

class PoolMixIn(ThreadingMixIn): 
    def process_request(self, request, client_address): 
     self.pool.submit(self.process_request_thread, request, client_address) 

def main(): 
    class PoolHTTPServer(PoolMixIn, HTTPServer): 
     pool = ThreadPoolExecutor(max_workers=40) 

    test(HandlerClass=SimpleHTTPRequestHandler, ServerClass=PoolHTTPServer) 

if __name__=="__main__": 
    main() 

오히려 간단하다. 이 명령은 http://your_host:8000/에 요청을 처리하기 위해 40 개 스레드 개까지 사용

$ python -mserver 

:

당신이 server.py에 저장할 경우에 당신은으로 실행할 수 있습니다.

HTTPServer의 주요 사용 사례는 테스트 용입니다.

+0

this 다중 처리 풀을 사용하는 것과 비슷하며 이는 최적의 솔루션이 아닙니다. 예를 들어 큐와 피클 등이 있습니다. [내 솔루션] (https://github.com/muayyad-alsadi/python-PooledProcessMixIn/wiki) 기능을 참조하십시오. –

+0

@muayyad : 1. stdlib 클래스는 개발/테스트 용 클래스입니다. 2. 위의 코드는 단순함으로 인해 작동 할 것으로 기대됩니다. 당신의 솔루션에 대해서도 똑같이 말할 수는 없습니다. 3. 벤치 마크가 있습니까? – jfs

+1

@ j-f-sebastian : 벤치 마크를하기 위해 포위 공격을 사용했습니다. 성능이 두 배가됩니다 (광산 비율 : 1530, 기타 믹스 인 약 800) –