2010-02-28 2 views
1

스플릿을 사용하여 분할하고 추가하려는 코드 기반이 있지만, 처리 방법이 비교적 새로운 코드 기반이 있습니다. 이 코드를 다시 작성하지 말고 문제 해결을 위해 저에게 던지기 만하면되는 바램을 존중 해주십시오. 나는 오히려 누군가 나를 위해 그것을 해결하는 것보다 올바른 방향으로 나를 가리키는 누군가에 의해 문제를 해결하려고한다. 나는 그렇게 잘 배우지 못합니다.파이썬 프로그램을 스레드 응용 프로그램으로 변환하는 프로세스가 있습니까?

완전히 작동하는 코드베이스는 here입니다. easy_install을 통해 설치할 수있는 mechanize 및 beautifulsoup 라이브러리가 필요합니다.

필자는 모든 기능을 분리하여 코드를 가능한 한 깨끗하게 유지하려고 노력했습니다. 그 중에 몇 가지 최적화 기능이 포함되어 있다고 확신하지만 주요 문제는

내 궁극적 인 목표는 스레드에이 팩을하는 것입니다.이 스레드, 내 원래의 코드가 '백그라운드로'실행되는 동안 다음 다른 일을하기 위해 다른 초기화 브라우저 객체 사이의 쿠키를 공유 할 수 있습니다.

을 제가했습니다 시도 :

class Recon(threading.Thread): 
    def __init__(self): 
     threading.Thread.__init__(self) 
     #Packed the stuff above my original while loop in here, minus functions. 
    def run(self): 
     #Packed my code past the while loop in here. 
somevar = Recon() 
somevar.start() 

문제 나는 프로그램을 실행하면 init에있는 것들을 실행할 것입니다. 그러나 이후에는 그냥 앉아서 멈춰 버립니다. 흔적도없고, 오류도없고, 아무 것도하지도 않으며 내 명령 프롬프트를 다시 내 통제로 돌려 보내지도 않습니다.

일부 팁이나 이것을 변환하는 방법에 대한 일반적인 흐름을 얻을 수 있습니까? 나는 압도되어서 내가 시도하고있는 코드를 삭제했기 때문에 나는 그 예를 가지고 있지 않지만 내가 '자기'를 앞세워야 할 필요가있다. 내 모든 변수에? 내 vars를 전역으로 정의해야합니까?

여기 스크립트를 threading으로 변환하려고 시도한 후 문제가 발생한 것을 재현합니다.

답변

3

단 하나의 스레드 (위의 코드 에서처럼 Recon을 한 번만 인스턴스화하는 것처럼)가 있으면 어디에서 무엇을하는지가 중요하지 않습니다. 하지만 물론 스레딩을 도입하는 이유가 궁극적으로 다중 스레드가 활성화되도록하는 것이라고 생각합니다.

그럴 경우 첫 번째 주요 문제는 두 개 이상의 스레드가 동시에 동일한 공유 시스템/리소스를 사용하려고 시도하지 않도록하는 것입니다. 예를 들어 복수 스레드를 동시에 쓰는 경우는 ReconFile, pastebin URL에있는 코드의 경우에 언급합니다.

이러한 문제를 피하는 고전적인 방법은 잠금을 사용하는 것입니다. 그러나 내가 선호하는 방법은 매우 다릅니다. 하나의 전용 스레드 만 이러한 리소스에 액세스하고 Queue.Queue 인스턴스 (본질적으로 threadsafe)를 사용하여 다른 스레드는 작업 요청을 전용 스레드에 게시합니다. 따라서 ReconFile에 직접 쓰는 대신 서로 다른 스레드가 연속적으로 쓰여지는 줄 목록을 만듭니다. .put "조정 파일 쓰기"작업자 스레드가 대기중인 큐의 목록 .get을 통해).

결과가 필요한 경우 (여기서는 해당하지 않음) 요청하는 스레드는 자신의 개인적인 "결과를 반환 할 큐"를 "작업 요청 패킷"의 일부로 배치하여 작업 스레드의 대기열."Python in a Nutshell"2nd edition의 스레딩 장에서이 권장 아키텍처에 대한 자세한 내용을 다뤘습니다. (물론 저자의 설명대로 을 권장합니다. 무료 해적판을 불법적으로 다운로드해야하는 이유는 무엇입니까? 내 책을 복사 할 수는 있지만 다운로드 할 수있는 해적판을 제공하는 많은 사이트가 있음을 언급 할 수 있습니다. 무료로 내 책을 읽을 수있는 합법적 인 방법은 O'Reilly의 "safari" 온라인 도서 웹 사이트에 대한 시험판 신청입니다.

이것은 하나의 스레드 만 가지고있을 때 발생하는 특정 문제를 해결하지 못합니다. 스레드가 표준 입력 및 표준 출력에서 ​​I/O를 많이 수행하려고 시도하는 것을 알 수 있습니다. 스레드에서 문제가 발생할 가능성이 있습니다. 스레드를 입력 할 때 을 입력하고을 시작합니다 (주 스레드에서). 필요한 출력은 파이썬의 표준 logging 모듈을 사용합니다. 은 스레드 안전성이 보장 된입니다. 그럼에도 문제가 계속 발생합니까? 그렇다면 다음 단계는 logging.info 호출로 코드를 페치하여 멈추는 부분을 정확히 찾아 낼 수 있으며 그 사실을 알려 주어 거기에서 도움을 얻을 수 있습니다!

+0

귀하의 가정은 모두 정확합니다. 나는 스레딩을 소개하고,리스트와 쿠키 객체만을 공유 할 미래의 코드를 준비하려고한다. 그 아이디어는 하나의 쓰레드로 데이터를 긁어 내고 다른 쓰레드에서 그 데이터를 처리하는 것입니다 (그러나 액세스되는 데이터는 결코 동시에 액세스되지 않습니다) init을 호출하고 실행하면 ... 내 init은 원시 입력을 요구하고, python은 init에서 입력을 기다리는 동안 실행 함수를 실행하게할까요? 아니면 init이 먼저 끝나야합니까? – ThantiK

+0

@ThantiK, Python의 모든 I/O 함수는 "GIL을 삭제합니다"(전역 인터프리터 잠금)하므로 다른 스레드 (I/O가 아닌 CPU 작업 포함)가 대신 할 수 있습니다. 그러나 스레드 하위 클래스의'__init__'는 스레드를 인스턴스화하는 스레드에서 실행됩니다 (일반적인 경우 기본 스레드, 특히 자신의 경우). 새 스레드는'start' 메서드 호출시에만 생성되며, run은'run' 메소드입니다. –

+0

이것은 나의 변환 결과로 지금은 잘 작동하고 있습니다 : http://pastebin.com/Pb582aF3 청결한 비평이나 비판을 환영하는 모든 도움을 환영합니다;) – ThantiK

관련 문제