2011-11-16 3 views
3

영원히 돌아가고 파일을 원격 서비스로 푸시하는 소켓 서버를 만들고 있습니다. 파일은 크고 많을 것이므로 물건을 움직일 수있는 스레드 된 스크립트를 작성하십시오. 이 문제에 접근하는 방법에 대해 몇 가지 질문이 있습니다.python에서 다중 스레드 접근에 대한 아키텍처 질문

이 설정에서는 파이썬에서 제공하는 큐를 사용합니다. 이는 내 파트에서 스레드 보안 트랜잭션을 구현하기 때문입니다. 나는 임의로 스레드 수를 10으로 설정 하겠지만 나중에 달콤한 번호를 찾기 위해 스레드와 함께 재생할 것입니다.

그래서 어떤 방법 내가해야 :

나는 비어있는 동안 큐가 채워 수면 상태에서 깨어 10 개 스레드를 만들어야합니까? (소비자 프로듀서 유형 거래)

최대 10 개가 될 때까지 스레드를 생성 한 다음 스레드가 완료 될 때까지 메인 프로그램을 잠자기 한 다음 주 스레드를 활성화하여 스레드를 하나 더 생성하고 단순히 대기열이 비어 있습니다.

두 방법의 장점/단점은 무엇입니까? 감사.

+1

"gevent"또는 "twisted"와 같은 비동기 접근법을 고려할 수 있습니다. threaded solution에 대해서는'concurrent.futures.ThreadedPoolExecutor'가 구현되는 방법을보십시오. – jfs

답변

2

스레드를 지속적으로 생성하고 종료하는 것은 비용이 많이 들고 오류가 발생하기 쉽고 성능과 신뢰성이 뛰어난 이유로 가능한 한 피해야합니다. '주 프로그램'의 마이크로 관리 스레드는 그냥 잘하면 좋을뿐입니다. 단지 나쁜 생각 일뿐입니다. 현대 언어/환경/라이브러리는 쓰레드 풀을 제공하여 쓰레드를 끊임없이 생성 및 파괴하고, 쓰레드가 CPU/슬립 루프로 끝나기를 기다리고, 쓰레드가 이벤트 핸들러에서 DoEvents 루프로 끝날 때까지 기다리는 것과 같은 끔찍한 일을하고, 목록에 스레드를 저장하고 스레드를 관리하려고 시도하면서 필요하지 않을 때 스레드를 명시 적으로 종료하고 기타 많은 불쾌한 관행을 사용합니다.

계획 'A'로 이동하십시오. FilePath, 원격 URI 및 기타 필요한 모든 항목 (예 : 오류 메시지 문자열 :)을 파일 인스턴스에 넣고 10 개의 스레드가있는 블록 생성자 - 소비자 대기열로 밀어 넣으십시오. 스레드가 스스로 관리하게하십시오.

+0

나는 풀 스레드에 대해 들어 본 적이 없지만 그것을 읽은 후에는 내가 취할 경로라고 생각합니다. 감사합니다! – tipu

+0

스레드 풀은 대기열에 걸려있는 스레드로드에 대한 멋진 이름입니다. 그들은 'task'또는 'runnable'의 인스턴스를 띄우고 run() 메소드를 호출합니다. 일반적으로 스레드는 스레드가 완료된 후에 작업 개체를 '반환'하는 구조화 된 메서드를 가지고 있습니다. 개발자는 'task'에서 상속 받거나 (또는 ​​일부 인터페이스를 구현합니다.) 자신의 run() 메소드를 제공하고 taskls를 대기열에 밀어 넣습니다. –